@pezkuwi/extension-base 0.62.8 → 0.62.12

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 (187) hide show
  1. package/LICENSE +201 -0
  2. package/background/RequestBytesSign.js +12 -0
  3. package/background/RequestExtrinsicSign.js +11 -0
  4. package/background/handlers/Extension.js +489 -0
  5. package/background/handlers/State.js +478 -0
  6. package/background/handlers/Tabs.js +195 -0
  7. package/{build/background → background}/handlers/helpers.js +1 -3
  8. package/background/handlers/index.js +40 -0
  9. package/background/handlers/subscriptions.js +18 -0
  10. package/background/index.js +1 -0
  11. package/bundle.js +1 -0
  12. package/cjs/background/RequestBytesSign.d.ts +12 -0
  13. package/cjs/background/RequestBytesSign.js +15 -0
  14. package/cjs/background/RequestExtrinsicSign.d.ts +12 -0
  15. package/cjs/background/RequestExtrinsicSign.js +14 -0
  16. package/cjs/background/handlers/Extension.d.ts +49 -0
  17. package/cjs/background/handlers/Extension.js +492 -0
  18. package/cjs/background/handlers/State.d.ts +96 -0
  19. package/cjs/background/handlers/State.js +482 -0
  20. package/cjs/background/handlers/Tabs.d.ts +25 -0
  21. package/cjs/background/handlers/Tabs.js +199 -0
  22. package/cjs/background/handlers/helpers.d.ts +1 -0
  23. package/cjs/background/handlers/helpers.js +14 -0
  24. package/cjs/background/handlers/index.d.ts +3 -0
  25. package/cjs/background/handlers/index.js +46 -0
  26. package/cjs/background/handlers/subscriptions.d.ts +3 -0
  27. package/cjs/background/handlers/subscriptions.js +22 -0
  28. package/cjs/background/index.d.ts +1 -0
  29. package/cjs/background/index.js +7 -0
  30. package/cjs/background/types.d.ts +343 -0
  31. package/cjs/background/types.js +2 -0
  32. package/cjs/bundle.d.ts +1 -0
  33. package/cjs/bundle.js +5 -0
  34. package/cjs/defaults.js +16 -0
  35. package/cjs/index.js +4 -0
  36. package/cjs/package.json +3 -0
  37. package/cjs/packageDetect.d.ts +1 -0
  38. package/cjs/packageDetect.js +8 -0
  39. package/cjs/packageInfo.js +4 -0
  40. package/cjs/page/Accounts.js +24 -0
  41. package/cjs/page/Injected.js +25 -0
  42. package/cjs/page/Metadata.js +15 -0
  43. package/cjs/page/PostMessageProvider.js +135 -0
  44. package/cjs/page/Signer.js +29 -0
  45. package/cjs/page/index.js +52 -0
  46. package/cjs/page/types.js +2 -0
  47. package/cjs/stores/Accounts.js +21 -0
  48. package/cjs/stores/Base.js +70 -0
  49. package/cjs/stores/Metadata.js +13 -0
  50. package/cjs/stores/index.js +8 -0
  51. package/cjs/types.js +2 -0
  52. package/cjs/utils/canDerive.js +6 -0
  53. package/cjs/utils/getId.js +8 -0
  54. package/cjs/utils/index.js +5 -0
  55. package/{build → cjs}/utils/portUtils.d.ts +0 -1
  56. package/cjs/utils/portUtils.js +49 -0
  57. package/defaults.d.ts +9 -0
  58. package/{src/defaults.ts → defaults.js} +2 -15
  59. package/index.d.ts +1 -0
  60. package/index.js +1 -0
  61. package/package.json +464 -10
  62. package/packageDetect.d.ts +1 -0
  63. package/{build/packageDetect.js → packageDetect.js} +0 -4
  64. package/packageInfo.d.ts +6 -0
  65. package/packageInfo.js +1 -0
  66. package/page/Accounts.d.ts +7 -0
  67. package/page/Accounts.js +21 -0
  68. package/page/Injected.d.ts +13 -0
  69. package/{build/page → page}/Injected.js +10 -10
  70. package/page/Metadata.d.ts +7 -0
  71. package/page/Metadata.js +12 -0
  72. package/page/PostMessageProvider.d.ts +63 -0
  73. package/page/PostMessageProvider.js +132 -0
  74. package/page/Signer.d.ts +8 -0
  75. package/page/Signer.js +26 -0
  76. package/page/index.d.ts +16 -0
  77. package/page/index.js +45 -0
  78. package/page/types.d.ts +6 -0
  79. package/page/types.js +1 -0
  80. package/stores/Accounts.d.ts +6 -0
  81. package/stores/Accounts.js +17 -0
  82. package/stores/Base.d.ts +9 -0
  83. package/stores/Base.js +67 -0
  84. package/stores/Metadata.d.ts +5 -0
  85. package/stores/Metadata.js +9 -0
  86. package/{src/stores/index.ts → stores/index.d.ts} +0 -3
  87. package/{build/stores → stores}/index.js +0 -2
  88. package/types.d.ts +9 -0
  89. package/types.js +1 -0
  90. package/utils/canDerive.d.ts +2 -0
  91. package/{build/utils → utils}/canDerive.js +0 -2
  92. package/utils/getId.d.ts +1 -0
  93. package/utils/getId.js +5 -0
  94. package/utils/index.d.ts +1 -0
  95. package/utils/index.js +1 -0
  96. package/utils/portUtils.d.ts +13 -0
  97. package/utils/portUtils.js +43 -0
  98. package/build/background/RequestBytesSign.js +0 -15
  99. package/build/background/RequestExtrinsicSign.js +0 -14
  100. package/build/background/handlers/Extension.js +0 -645
  101. package/build/background/handlers/State.js +0 -732
  102. package/build/background/handlers/Tabs.js +0 -313
  103. package/build/background/handlers/index.js +0 -45
  104. package/build/background/handlers/subscriptions.js +0 -22
  105. package/build/background/index.js +0 -3
  106. package/build/background/types.js +0 -3
  107. package/build/bundle.js +0 -3
  108. package/build/defaults.js +0 -17
  109. package/build/index.js +0 -5
  110. package/build/packageInfo.js +0 -4
  111. package/build/page/Accounts.js +0 -26
  112. package/build/page/Metadata.js +0 -17
  113. package/build/page/PostMessageProvider.js +0 -234
  114. package/build/page/Signer.js +0 -92
  115. package/build/page/index.js +0 -102
  116. package/build/page/types.js +0 -3
  117. package/build/stores/Accounts.js +0 -83
  118. package/build/stores/Base.js +0 -250
  119. package/build/stores/Metadata.js +0 -29
  120. package/build/types.js +0 -3
  121. package/build/utils/getId.js +0 -7
  122. package/build/utils/index.js +0 -3
  123. package/build/utils/portUtils.js +0 -106
  124. package/src/background/RequestBytesSign.ts +0 -28
  125. package/src/background/RequestExtrinsicSign.ts +0 -22
  126. package/src/background/handlers/Extension.spec.ts +0 -478
  127. package/src/background/handlers/Extension.ts +0 -690
  128. package/src/background/handlers/State.ts +0 -664
  129. package/src/background/handlers/Tabs.ts +0 -289
  130. package/src/background/handlers/helpers.ts +0 -14
  131. package/src/background/handlers/index.ts +0 -60
  132. package/src/background/handlers/subscriptions.ts +0 -32
  133. package/src/background/index.ts +0 -4
  134. package/src/background/types.ts +0 -432
  135. package/src/bundle.ts +0 -4
  136. package/src/index.ts +0 -7
  137. package/src/packageDetect.ts +0 -14
  138. package/src/packageInfo.ts +0 -6
  139. package/src/page/Accounts.ts +0 -33
  140. package/src/page/Injected.ts +0 -33
  141. package/src/page/Metadata.ts +0 -22
  142. package/src/page/PostMessageProvider.ts +0 -182
  143. package/src/page/Signer.ts +0 -45
  144. package/src/page/index.ts +0 -89
  145. package/src/page/types.ts +0 -10
  146. package/src/stores/Accounts.ts +0 -28
  147. package/src/stores/Base.ts +0 -93
  148. package/src/stores/Metadata.ts +0 -17
  149. package/src/types.ts +0 -12
  150. package/src/utils/canDerive.ts +0 -8
  151. package/src/utils/getId.ts +0 -10
  152. package/src/utils/index.ts +0 -4
  153. package/src/utils/portUtils.ts +0 -65
  154. package/tsconfig.build.json +0 -16
  155. package/tsconfig.build.tsbuildinfo +0 -1
  156. package/tsconfig.spec.json +0 -18
  157. package/tsconfig.spec.tsbuildinfo +0 -1
  158. /package/{build/background → background}/RequestBytesSign.d.ts +0 -0
  159. /package/{build/background → background}/RequestExtrinsicSign.d.ts +0 -0
  160. /package/{build/background → background}/handlers/Extension.d.ts +0 -0
  161. /package/{build/background → background}/handlers/State.d.ts +0 -0
  162. /package/{build/background → background}/handlers/Tabs.d.ts +0 -0
  163. /package/{build/background → background}/handlers/helpers.d.ts +0 -0
  164. /package/{build/background → background}/handlers/index.d.ts +0 -0
  165. /package/{build/background → background}/handlers/subscriptions.d.ts +0 -0
  166. /package/{build/background → background}/index.d.ts +0 -0
  167. /package/{build/background → background}/types.d.ts +0 -0
  168. /package/{build/packageDetect.d.ts → background/types.js} +0 -0
  169. /package/{build/bundle.d.ts → bundle.d.ts} +0 -0
  170. /package/{build → cjs}/defaults.d.ts +0 -0
  171. /package/{build → cjs}/index.d.ts +0 -0
  172. /package/{build → cjs}/packageInfo.d.ts +0 -0
  173. /package/{build → cjs}/page/Accounts.d.ts +0 -0
  174. /package/{build → cjs}/page/Injected.d.ts +0 -0
  175. /package/{build → cjs}/page/Metadata.d.ts +0 -0
  176. /package/{build → cjs}/page/PostMessageProvider.d.ts +0 -0
  177. /package/{build → cjs}/page/Signer.d.ts +0 -0
  178. /package/{build → cjs}/page/index.d.ts +0 -0
  179. /package/{build → cjs}/page/types.d.ts +0 -0
  180. /package/{build → cjs}/stores/Accounts.d.ts +0 -0
  181. /package/{build → cjs}/stores/Base.d.ts +0 -0
  182. /package/{build → cjs}/stores/Metadata.d.ts +0 -0
  183. /package/{build → cjs}/stores/index.d.ts +0 -0
  184. /package/{build → cjs}/types.d.ts +0 -0
  185. /package/{build → cjs}/utils/canDerive.d.ts +0 -0
  186. /package/{build → cjs}/utils/getId.d.ts +0 -0
  187. /package/{build → cjs}/utils/index.d.ts +0 -0
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const rxjs_1 = require("rxjs");
5
+ const phishing_1 = require("@pezkuwi/phishing");
6
+ const ui_keyring_1 = require("@pezkuwi/ui-keyring");
7
+ const accounts_1 = require("@pezkuwi/ui-keyring/observable/accounts");
8
+ const util_1 = require("@pezkuwi/util");
9
+ const defaults_js_1 = require("../../defaults.js");
10
+ const index_js_1 = require("../../utils/index.js");
11
+ const RequestBytesSign_js_1 = tslib_1.__importDefault(require("../RequestBytesSign.js"));
12
+ const RequestExtrinsicSign_js_1 = tslib_1.__importDefault(require("../RequestExtrinsicSign.js"));
13
+ const helpers_js_1 = require("./helpers.js");
14
+ const subscriptions_js_1 = require("./subscriptions.js");
15
+ function transformAccounts(accounts, anyType = false) {
16
+ return Object
17
+ .values(accounts)
18
+ .filter(({ json: { meta: { isHidden } } }) => !isHidden)
19
+ .filter(({ type }) => anyType ? true : (0, index_js_1.canDerive)(type))
20
+ .sort((a, b) => (a.json.meta.whenCreated || 0) - (b.json.meta.whenCreated || 0))
21
+ .map(({ json: { address, meta: { genesisHash, name } }, type }) => ({
22
+ address,
23
+ genesisHash,
24
+ name,
25
+ type
26
+ }));
27
+ }
28
+ class Tabs {
29
+ #accountSubs = {};
30
+ #state;
31
+ constructor(state) {
32
+ this.#state = state;
33
+ }
34
+ filterForAuthorizedAccounts(accounts, url) {
35
+ const auth = this.#state.authUrls[this.#state.stripUrl(url)];
36
+ if (!auth) {
37
+ return [];
38
+ }
39
+ return accounts.filter((allAcc) => auth.authorizedAccounts
40
+ // we have a list, use it
41
+ ? auth.authorizedAccounts.includes(allAcc.address)
42
+ // if no authorizedAccounts and isAllowed return all - these are old converted urls
43
+ : auth.isAllowed);
44
+ }
45
+ authorize(url, request) {
46
+ return this.#state.authorizeUrl(url, request);
47
+ }
48
+ accountsListAuthorized(url, { anyType }) {
49
+ const transformedAccounts = transformAccounts(accounts_1.accounts.subject.getValue(), anyType);
50
+ return this.filterForAuthorizedAccounts(transformedAccounts, url);
51
+ }
52
+ accountsSubscribeAuthorized(url, id, port) {
53
+ const cb = (0, subscriptions_js_1.createSubscription)(id, port);
54
+ const strippedUrl = this.#state.stripUrl(url);
55
+ const authUrlObservable = this.#state.authUrlSubjects[strippedUrl]?.asObservable();
56
+ if (!authUrlObservable) {
57
+ console.error(`No authUrlSubject found for ${strippedUrl}`);
58
+ return id;
59
+ }
60
+ this.#accountSubs[id] = {
61
+ subscription: (0, rxjs_1.combineLatest)([accounts_1.accounts.subject, authUrlObservable]).subscribe(([accounts, _authUrlInfo]) => {
62
+ const transformedAccounts = transformAccounts(accounts);
63
+ cb(this.filterForAuthorizedAccounts(transformedAccounts, url));
64
+ }),
65
+ url
66
+ };
67
+ port.onDisconnect.addListener(() => {
68
+ this.accountsUnsubscribe(url, { id });
69
+ });
70
+ return id;
71
+ }
72
+ accountsUnsubscribe(url, { id }) {
73
+ const sub = this.#accountSubs[id];
74
+ if (!sub || sub.url !== url) {
75
+ return false;
76
+ }
77
+ delete this.#accountSubs[id];
78
+ (0, subscriptions_js_1.unsubscribe)(id);
79
+ sub.subscription.unsubscribe();
80
+ return true;
81
+ }
82
+ getSigningPair(address) {
83
+ const pair = ui_keyring_1.keyring.getPair(address);
84
+ (0, util_1.assert)(pair, 'Unable to find keypair');
85
+ return pair;
86
+ }
87
+ bytesSign(url, request) {
88
+ const address = request.address;
89
+ const pair = this.getSigningPair(address);
90
+ return this.#state.sign(url, new RequestBytesSign_js_1.default(request), { address, ...pair.meta });
91
+ }
92
+ extrinsicSign(url, request) {
93
+ const address = request.address;
94
+ const pair = this.getSigningPair(address);
95
+ return this.#state.sign(url, new RequestExtrinsicSign_js_1.default(request), { address, ...pair.meta });
96
+ }
97
+ metadataProvide(url, request) {
98
+ return this.#state.injectMetadata(url, request);
99
+ }
100
+ metadataList(_url) {
101
+ return this.#state.knownMetadata.map(({ genesisHash, specVersion }) => ({
102
+ genesisHash,
103
+ specVersion
104
+ }));
105
+ }
106
+ rpcListProviders() {
107
+ return this.#state.rpcListProviders();
108
+ }
109
+ rpcSend(request, port) {
110
+ return this.#state.rpcSend(request, port);
111
+ }
112
+ rpcStartProvider(key, port) {
113
+ return this.#state.rpcStartProvider(key, port);
114
+ }
115
+ async rpcSubscribe(request, id, port) {
116
+ const innerCb = (0, subscriptions_js_1.createSubscription)(id, port);
117
+ const cb = (_error, data) => innerCb(data);
118
+ const subscriptionId = await this.#state.rpcSubscribe(request, cb, port);
119
+ port.onDisconnect.addListener(() => {
120
+ (0, subscriptions_js_1.unsubscribe)(id);
121
+ (0, helpers_js_1.withErrorLog)(() => this.rpcUnsubscribe({ ...request, subscriptionId }, port));
122
+ });
123
+ return true;
124
+ }
125
+ rpcSubscribeConnected(request, id, port) {
126
+ const innerCb = (0, subscriptions_js_1.createSubscription)(id, port);
127
+ const cb = (_error, data) => innerCb(data);
128
+ this.#state.rpcSubscribeConnected(request, cb, port);
129
+ port.onDisconnect.addListener(() => {
130
+ (0, subscriptions_js_1.unsubscribe)(id);
131
+ });
132
+ return Promise.resolve(true);
133
+ }
134
+ async rpcUnsubscribe(request, port) {
135
+ return this.#state.rpcUnsubscribe(request, port);
136
+ }
137
+ redirectPhishingLanding(phishingWebsite) {
138
+ const nonFragment = phishingWebsite.split('#')[0];
139
+ const encodedWebsite = encodeURIComponent(nonFragment);
140
+ const url = `${chrome.runtime.getURL('index.html')}#${defaults_js_1.PHISHING_PAGE_REDIRECT}/${encodedWebsite}`;
141
+ chrome.tabs.query({ url: nonFragment }, (tabs) => {
142
+ tabs
143
+ .map(({ id }) => id)
144
+ .filter((id) => (0, util_1.isNumber)(id))
145
+ .forEach((id) => (0, helpers_js_1.withErrorLog)(() => chrome.tabs.update(id, { url })));
146
+ });
147
+ }
148
+ async redirectIfPhishing(url) {
149
+ const isInDenyList = await (0, phishing_1.checkIfDenied)(url);
150
+ if (isInDenyList) {
151
+ this.redirectPhishingLanding(url);
152
+ return true;
153
+ }
154
+ return false;
155
+ }
156
+ async handle(id, type, request, url, port) {
157
+ if (type === 'pub(phishing.redirectIfDenied)') {
158
+ return this.redirectIfPhishing(url);
159
+ }
160
+ if (type !== 'pub(authorize.tab)') {
161
+ this.#state.ensureUrlAuthorized(url);
162
+ }
163
+ switch (type) {
164
+ case 'pub(authorize.tab)':
165
+ return this.authorize(url, request);
166
+ case 'pub(accounts.list)':
167
+ return this.accountsListAuthorized(url, request);
168
+ case 'pub(accounts.subscribe)':
169
+ return port && this.accountsSubscribeAuthorized(url, id, port);
170
+ case 'pub(accounts.unsubscribe)':
171
+ return this.accountsUnsubscribe(url, request);
172
+ case 'pub(bytes.sign)':
173
+ return this.bytesSign(url, request);
174
+ case 'pub(extrinsic.sign)':
175
+ return this.extrinsicSign(url, request);
176
+ case 'pub(metadata.list)':
177
+ return this.metadataList(url);
178
+ case 'pub(metadata.provide)':
179
+ return this.metadataProvide(url, request);
180
+ case 'pub(ping)':
181
+ return Promise.resolve(true);
182
+ case 'pub(rpc.listProviders)':
183
+ return this.rpcListProviders();
184
+ case 'pub(rpc.send)':
185
+ return port && this.rpcSend(request, port);
186
+ case 'pub(rpc.startProvider)':
187
+ return port && this.rpcStartProvider(request, port);
188
+ case 'pub(rpc.subscribe)':
189
+ return port && this.rpcSubscribe(request, id, port);
190
+ case 'pub(rpc.subscribeConnected)':
191
+ return port && this.rpcSubscribeConnected(request, id, port);
192
+ case 'pub(rpc.unsubscribe)':
193
+ return port && this.rpcUnsubscribe(request, port);
194
+ default:
195
+ throw new Error(`Unable to handle message of type ${type}`);
196
+ }
197
+ }
198
+ }
199
+ exports.default = Tabs;
@@ -0,0 +1 @@
1
+ export declare function withErrorLog(fn: () => unknown): void;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withErrorLog = withErrorLog;
4
+ function withErrorLog(fn) {
5
+ try {
6
+ const p = fn();
7
+ if (p && typeof p === 'object' && typeof p.catch === 'function') {
8
+ p.catch(console.error);
9
+ }
10
+ }
11
+ catch (e) {
12
+ console.error(e);
13
+ }
14
+ }
@@ -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,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withErrorLog = void 0;
4
+ exports.default = handler;
5
+ const tslib_1 = require("tslib");
6
+ const util_1 = require("@pezkuwi/util");
7
+ const defaults_js_1 = require("../../defaults.js");
8
+ const Extension_js_1 = tslib_1.__importDefault(require("./Extension.js"));
9
+ const State_js_1 = tslib_1.__importDefault(require("./State.js"));
10
+ const Tabs_js_1 = tslib_1.__importDefault(require("./Tabs.js"));
11
+ var helpers_js_1 = require("./helpers.js");
12
+ Object.defineProperty(exports, "withErrorLog", { enumerable: true, get: function () { return helpers_js_1.withErrorLog; } });
13
+ const state = new State_js_1.default();
14
+ await state.init();
15
+ const extension = new Extension_js_1.default(state);
16
+ const tabs = new Tabs_js_1.default(state);
17
+ function handler({ id, message, request }, port, extensionPortName = defaults_js_1.PORT_EXTENSION) {
18
+ const isExtension = !port || port?.name === extensionPortName;
19
+ const sender = port?.sender;
20
+ if (!isExtension && !sender) {
21
+ throw new Error('Unable to extract message sender');
22
+ }
23
+ const from = isExtension
24
+ ? 'extension'
25
+ : sender?.url || sender?.tab?.url || '<unknown>';
26
+ const source = `${from}: ${id}: ${message}`;
27
+ console.log(` [in] ${source}`); // :: ${JSON.stringify(request)}`);
28
+ const promise = isExtension
29
+ ? extension.handle(id, message, request, port)
30
+ : tabs.handle(id, message, request, from, port);
31
+ promise
32
+ .then((response) => {
33
+ console.log(`[out] ${source}`); // :: ${JSON.stringify(response)}`);
34
+ // between the start and the end of the promise, the user may have closed
35
+ // the tab, in which case port will be undefined
36
+ (0, util_1.assert)(port, 'Port has been disconnected');
37
+ port.postMessage({ id, response });
38
+ })
39
+ .catch((error) => {
40
+ console.log(`[err] ${source}:: ${error.message}`);
41
+ // only send message back to port if it's still connected
42
+ if (port) {
43
+ port.postMessage({ error: error.message, id });
44
+ }
45
+ });
46
+ }
@@ -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
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSubscription = createSubscription;
4
+ exports.unsubscribe = unsubscribe;
5
+ const subscriptions = {};
6
+ function createSubscription(id, port) {
7
+ subscriptions[id] = port;
8
+ return (subscription) => {
9
+ if (subscriptions[id]) {
10
+ port.postMessage({ id, subscription });
11
+ }
12
+ };
13
+ }
14
+ function unsubscribe(id) {
15
+ if (subscriptions[id]) {
16
+ console.log(`Unsubscribing from ${id}`);
17
+ delete subscriptions[id];
18
+ }
19
+ else {
20
+ console.error(`Unable to unsubscribe from ${id}`);
21
+ }
22
+ }
@@ -0,0 +1 @@
1
+ export { default as handlers, withErrorLog } from './handlers/index.js';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withErrorLog = exports.handlers = void 0;
4
+ const tslib_1 = require("tslib");
5
+ var index_js_1 = require("./handlers/index.js");
6
+ Object.defineProperty(exports, "handlers", { enumerable: true, get: function () { return tslib_1.__importDefault(index_js_1).default; } });
7
+ Object.defineProperty(exports, "withErrorLog", { enumerable: true, get: function () { return index_js_1.withErrorLog; } });
@@ -0,0 +1,343 @@
1
+ import type { InjectedAccount, InjectedMetadataKnown, MetadataDef, ProviderList, ProviderMeta } from '@pezkuwi/extension-inject/types';
2
+ import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta } from '@pezkuwi/keyring/types';
3
+ import type { JsonRpcResponse } from '@pezkuwi/rpc-provider/types';
4
+ import type { Registry, SignerPayloadJSON, SignerPayloadRaw } from '@pezkuwi/types/types';
5
+ import type { KeyringPairs$Json } from '@pezkuwi/ui-keyring/types';
6
+ import type { HexString } from '@pezkuwi/util/types';
7
+ import type { KeypairType } from '@pezkuwi/util-crypto/types';
8
+ import type { ALLOWED_PATH } from '../defaults.js';
9
+ import type { AuthResponse } from './handlers/State.js';
10
+ type KeysWithDefinedValues<T> = {
11
+ [K in keyof T]: T[K] extends undefined ? never : K;
12
+ }[keyof T];
13
+ type NoUndefinedValues<T> = {
14
+ [K in KeysWithDefinedValues<T>]: T[K];
15
+ };
16
+ type IsNull<T, K extends keyof T> = {
17
+ [K1 in Exclude<keyof T, K>]: T[K1];
18
+ } & T[K] extends null ? K : never;
19
+ type NullKeys<T> = {
20
+ [K in keyof T]: IsNull<T, K>;
21
+ }[keyof T];
22
+ export type AuthUrls = Record<string, AuthUrlInfo>;
23
+ export interface AuthUrlInfo {
24
+ count: number;
25
+ id: string;
26
+ isAllowed?: boolean;
27
+ origin: string;
28
+ url: string;
29
+ authorizedAccounts: string[];
30
+ }
31
+ export type SeedLengths = 12 | 24;
32
+ export interface AccountJson extends KeyringPair$Meta {
33
+ address: string;
34
+ }
35
+ export type AccountWithChildren = AccountJson & {
36
+ children?: AccountWithChildren[];
37
+ };
38
+ export interface AccountsContext {
39
+ accounts: AccountJson[];
40
+ hierarchy: AccountWithChildren[];
41
+ master?: AccountJson;
42
+ selectedAccounts?: AccountJson['address'][];
43
+ setSelectedAccounts?: (address: AccountJson['address'][]) => void;
44
+ }
45
+ export interface AuthorizeRequest {
46
+ id: string;
47
+ request: RequestAuthorizeTab;
48
+ url: string;
49
+ }
50
+ export interface MetadataRequest {
51
+ id: string;
52
+ request: MetadataDef;
53
+ url: string;
54
+ }
55
+ export interface SigningRequest {
56
+ account: AccountJson;
57
+ id: string;
58
+ request: RequestSign;
59
+ url: string;
60
+ }
61
+ export type ConnectedTabsUrlResponse = string[];
62
+ export interface RequestSignatures {
63
+ 'pri(accounts.create.external)': [RequestAccountCreateExternal, boolean];
64
+ 'pri(accounts.create.hardware)': [RequestAccountCreateHardware, boolean];
65
+ 'pri(accounts.create.suri)': [RequestAccountCreateSuri, boolean];
66
+ 'pri(accounts.edit)': [RequestAccountEdit, boolean];
67
+ 'pri(accounts.export)': [RequestAccountExport, ResponseAccountExport];
68
+ 'pri(accounts.batchExport)': [RequestAccountBatchExport, ResponseAccountsExport];
69
+ 'pri(accounts.forget)': [RequestAccountForget, boolean];
70
+ 'pri(accounts.list)': [RequestAccountList, InjectedAccount[]];
71
+ 'pri(accounts.show)': [RequestAccountShow, boolean];
72
+ 'pri(accounts.tie)': [RequestAccountTie, boolean];
73
+ 'pri(accounts.subscribe)': [RequestAccountSubscribe, boolean, AccountJson[]];
74
+ 'pri(accounts.validate)': [RequestAccountValidate, boolean];
75
+ 'pri(accounts.changePassword)': [RequestAccountChangePassword, boolean];
76
+ 'pri(authorize.approve)': [RequestAuthorizeApprove, boolean];
77
+ 'pri(authorize.list)': [null, ResponseAuthorizeList];
78
+ 'pri(authorize.requests)': [RequestAuthorizeSubscribe, boolean, AuthorizeRequest[]];
79
+ 'pri(authorize.remove)': [string, ResponseAuthorizeList];
80
+ 'pri(authorize.reject)': [string, void];
81
+ 'pri(authorize.cancel)': [string, void];
82
+ 'pri(authorize.update)': [RequestUpdateAuthorizedAccounts, void];
83
+ 'pri(activeTabsUrl.update)': [RequestActiveTabsUrlUpdate, void];
84
+ 'pri(connectedTabsUrl.get)': [null, ConnectedTabsUrlResponse];
85
+ 'pri(derivation.create)': [RequestDeriveCreate, boolean];
86
+ 'pri(derivation.validate)': [RequestDeriveValidate, ResponseDeriveValidate];
87
+ 'pri(json.restore)': [RequestJsonRestore, void];
88
+ 'pri(json.batchRestore)': [RequestBatchRestore, void];
89
+ 'pri(json.account.info)': [KeyringPair$Json, ResponseJsonGetAccountInfo];
90
+ 'pri(metadata.approve)': [RequestMetadataApprove, boolean];
91
+ 'pri(metadata.get)': [string | null, MetadataDef | null];
92
+ 'pri(metadata.reject)': [RequestMetadataReject, boolean];
93
+ 'pri(metadata.requests)': [RequestMetadataSubscribe, boolean, MetadataRequest[]];
94
+ 'pri(metadata.list)': [null, MetadataDef[]];
95
+ 'pri(ping)': [null, boolean];
96
+ 'pri(seed.create)': [RequestSeedCreate, ResponseSeedCreate];
97
+ 'pri(seed.validate)': [RequestSeedValidate, ResponseSeedValidate];
98
+ 'pri(settings.notification)': [string, boolean];
99
+ 'pri(signing.approve.password)': [RequestSigningApprovePassword, boolean];
100
+ 'pri(signing.approve.signature)': [RequestSigningApproveSignature, boolean];
101
+ 'pri(signing.cancel)': [RequestSigningCancel, boolean];
102
+ 'pri(signing.isLocked)': [RequestSigningIsLocked, ResponseSigningIsLocked];
103
+ 'pri(signing.requests)': [RequestSigningSubscribe, boolean, SigningRequest[]];
104
+ 'pri(window.open)': [AllowedPath, boolean];
105
+ 'pub(accounts.list)': [RequestAccountList, InjectedAccount[]];
106
+ 'pub(accounts.subscribe)': [RequestAccountSubscribe, string, InjectedAccount[]];
107
+ 'pub(accounts.unsubscribe)': [RequestAccountUnsubscribe, boolean];
108
+ 'pub(authorize.tab)': [RequestAuthorizeTab, Promise<AuthResponse>];
109
+ 'pub(bytes.sign)': [SignerPayloadRaw, ResponseSigning];
110
+ 'pub(extrinsic.sign)': [SignerPayloadJSON, ResponseSigning];
111
+ 'pub(metadata.list)': [null, InjectedMetadataKnown[]];
112
+ 'pub(metadata.provide)': [MetadataDef, boolean];
113
+ 'pub(phishing.redirectIfDenied)': [null, boolean];
114
+ 'pub(ping)': [null, boolean];
115
+ 'pub(rpc.listProviders)': [void, ResponseRpcListProviders];
116
+ 'pub(rpc.send)': [RequestRpcSend, JsonRpcResponse<unknown>];
117
+ 'pub(rpc.startProvider)': [string, ProviderMeta];
118
+ 'pub(rpc.subscribe)': [RequestRpcSubscribe, number, JsonRpcResponse<unknown>];
119
+ 'pub(rpc.subscribeConnected)': [null, boolean, boolean];
120
+ 'pub(rpc.unsubscribe)': [RequestRpcUnsubscribe, boolean];
121
+ }
122
+ export type MessageTypes = keyof RequestSignatures;
123
+ export type RequestTypes = {
124
+ [MessageType in keyof RequestSignatures]: RequestSignatures[MessageType][0];
125
+ };
126
+ export type MessageTypesWithNullRequest = NullKeys<RequestTypes>;
127
+ export interface TransportRequestMessage<TMessageType extends MessageTypes> {
128
+ id: string;
129
+ message: TMessageType;
130
+ origin: string;
131
+ request: RequestTypes[TMessageType];
132
+ }
133
+ export interface RequestAuthorizeTab {
134
+ origin: string;
135
+ }
136
+ export interface RequestAuthorizeApprove {
137
+ id: string;
138
+ authorizedAccounts: string[];
139
+ }
140
+ export interface RequestUpdateAuthorizedAccounts {
141
+ url: string;
142
+ authorizedAccounts: string[];
143
+ }
144
+ export type RequestAuthorizeSubscribe = null;
145
+ export interface RequestMetadataApprove {
146
+ id: string;
147
+ }
148
+ export interface RequestMetadataReject {
149
+ id: string;
150
+ }
151
+ export type RequestMetadataSubscribe = null;
152
+ export interface RequestAccountCreateExternal {
153
+ address: string;
154
+ genesisHash?: HexString | null;
155
+ name: string;
156
+ }
157
+ export interface RequestAccountCreateSuri {
158
+ name: string;
159
+ genesisHash?: HexString | null;
160
+ password: string;
161
+ suri: string;
162
+ type?: KeypairType;
163
+ }
164
+ export interface RequestAccountCreateHardware {
165
+ accountIndex: number;
166
+ address: string;
167
+ addressOffset: number;
168
+ genesisHash: HexString;
169
+ hardwareType: string;
170
+ name: string;
171
+ type: KeypairType;
172
+ }
173
+ export interface RequestAccountChangePassword {
174
+ address: string;
175
+ oldPass: string;
176
+ newPass: string;
177
+ }
178
+ export interface RequestAccountEdit {
179
+ address: string;
180
+ genesisHash?: HexString | null;
181
+ name: string;
182
+ }
183
+ export interface RequestAccountForget {
184
+ address: string;
185
+ }
186
+ export interface RequestAccountShow {
187
+ address: string;
188
+ isShowing: boolean;
189
+ }
190
+ export interface RequestAccountTie {
191
+ address: string;
192
+ genesisHash: HexString | null;
193
+ }
194
+ export interface RequestAccountValidate {
195
+ address: string;
196
+ password: string;
197
+ }
198
+ export interface RequestDeriveCreate {
199
+ name: string;
200
+ genesisHash?: HexString | null;
201
+ suri: string;
202
+ parentAddress: string;
203
+ parentPassword: string;
204
+ password: string;
205
+ }
206
+ export interface RequestDeriveValidate {
207
+ suri: string;
208
+ parentAddress: string;
209
+ parentPassword: string;
210
+ }
211
+ export interface RequestAccountExport {
212
+ address: string;
213
+ password: string;
214
+ }
215
+ export interface RequestAccountBatchExport {
216
+ addresses: string[];
217
+ password: string;
218
+ }
219
+ export interface RequestAccountList {
220
+ anyType?: boolean;
221
+ }
222
+ export type RequestAccountSubscribe = null;
223
+ export interface RequestActiveTabsUrlUpdate {
224
+ urls: string[];
225
+ }
226
+ export interface RequestAccountUnsubscribe {
227
+ id: string;
228
+ }
229
+ export interface RequestRpcSend {
230
+ method: string;
231
+ params: unknown[];
232
+ }
233
+ export interface RequestRpcSubscribe extends RequestRpcSend {
234
+ type: string;
235
+ }
236
+ export interface RequestRpcUnsubscribe {
237
+ method: string;
238
+ subscriptionId: number | string;
239
+ type: string;
240
+ }
241
+ export interface RequestSigningApprovePassword {
242
+ id: string;
243
+ password?: string;
244
+ savePass: boolean;
245
+ }
246
+ export interface RequestSigningApproveSignature {
247
+ id: string;
248
+ signature: HexString;
249
+ signedTransaction?: HexString;
250
+ }
251
+ export interface RequestSigningCancel {
252
+ id: string;
253
+ }
254
+ export interface RequestSigningIsLocked {
255
+ id: string;
256
+ }
257
+ export interface ResponseSigningIsLocked {
258
+ isLocked: boolean;
259
+ remainingTime: number;
260
+ }
261
+ export type RequestSigningSubscribe = null;
262
+ export interface RequestSeedCreate {
263
+ length?: SeedLengths;
264
+ seed?: string;
265
+ type?: KeypairType;
266
+ }
267
+ export interface RequestSeedValidate {
268
+ suri: string;
269
+ type?: KeypairType;
270
+ }
271
+ export type ResponseTypes = {
272
+ [MessageType in keyof RequestSignatures]: RequestSignatures[MessageType][1];
273
+ };
274
+ export type ResponseType<TMessageType extends keyof RequestSignatures> = RequestSignatures[TMessageType][1];
275
+ interface TransportResponseMessageSub<TMessageType extends MessageTypesWithSubscriptions> {
276
+ error?: string;
277
+ id: string;
278
+ response?: ResponseTypes[TMessageType];
279
+ subscription?: SubscriptionMessageTypes[TMessageType];
280
+ }
281
+ interface TransportResponseMessageNoSub<TMessageType extends MessageTypesWithNoSubscriptions> {
282
+ error?: string;
283
+ id: string;
284
+ response?: ResponseTypes[TMessageType];
285
+ }
286
+ export type TransportResponseMessage<TMessageType extends MessageTypes> = TMessageType extends MessageTypesWithNoSubscriptions ? TransportResponseMessageNoSub<TMessageType> : TMessageType extends MessageTypesWithSubscriptions ? TransportResponseMessageSub<TMessageType> : never;
287
+ export interface ResponseSigning {
288
+ id: string;
289
+ signature: HexString;
290
+ signedTransaction?: HexString;
291
+ }
292
+ export interface ResponseDeriveValidate {
293
+ address: string;
294
+ suri: string;
295
+ }
296
+ export interface ResponseSeedCreate {
297
+ address: string;
298
+ seed: string;
299
+ }
300
+ export interface ResponseSeedValidate {
301
+ address: string;
302
+ suri: string;
303
+ }
304
+ export interface ResponseAccountExport {
305
+ exportedJson: KeyringPair$Json;
306
+ }
307
+ export interface ResponseAccountsExport {
308
+ exportedJson: KeyringPairs$Json;
309
+ }
310
+ export type ResponseRpcListProviders = ProviderList;
311
+ export type SubscriptionMessageTypes = NoUndefinedValues<{
312
+ [MessageType in keyof RequestSignatures]: RequestSignatures[MessageType][2];
313
+ }>;
314
+ export type MessageTypesWithSubscriptions = keyof SubscriptionMessageTypes;
315
+ export type MessageTypesWithNoSubscriptions = Exclude<MessageTypes, keyof SubscriptionMessageTypes>;
316
+ export interface RequestSign {
317
+ readonly payload: SignerPayloadJSON | SignerPayloadRaw;
318
+ sign(registry: Registry, pair: KeyringPair): {
319
+ signature: HexString;
320
+ };
321
+ }
322
+ export interface RequestJsonRestore {
323
+ file: KeyringPair$Json;
324
+ password: string;
325
+ }
326
+ export interface RequestBatchRestore {
327
+ file: KeyringPairs$Json;
328
+ password: string;
329
+ }
330
+ export interface ResponseJsonRestore {
331
+ error: string | null;
332
+ }
333
+ export type AllowedPath = typeof ALLOWED_PATH[number];
334
+ export interface ResponseJsonGetAccountInfo {
335
+ address: string;
336
+ name: string;
337
+ genesisHash: HexString;
338
+ type: KeypairType;
339
+ }
340
+ export interface ResponseAuthorizeList {
341
+ list: AuthUrls;
342
+ }
343
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export { packageInfo } from './packageInfo.js';
package/cjs/bundle.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.packageInfo = void 0;
4
+ var packageInfo_js_1 = require("./packageInfo.js");
5
+ Object.defineProperty(exports, "packageInfo", { enumerable: true, get: function () { return packageInfo_js_1.packageInfo; } });
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PHISHING_PAGE_REDIRECT = exports.PASSWORD_EXPIRY_MS = exports.PASSWORD_EXPIRY_MIN = exports.ALLOWED_PATH = exports.MESSAGE_ORIGIN_CONTENT = exports.MESSAGE_ORIGIN_PAGE = exports.PORT_EXTENSION = exports.PORT_CONTENT = exports.EXTENSION_PREFIX = void 0;
4
+ exports.EXTENSION_PREFIX = process.env['EXTENSION_PREFIX'] || '';
5
+ if (!exports.EXTENSION_PREFIX && !process.env['PORT_PREFIX']) {
6
+ throw new Error('CRITICAL: The extension does not define an own EXTENSION_PREFIX environment variable as part of the build, this is required to ensure that messages are not shared between extensions. Failure to do so will yield messages sent to multiple extensions.');
7
+ }
8
+ const PORT_PREFIX = `${exports.EXTENSION_PREFIX || 'unknown'}-${process.env['PORT_PREFIX'] || 'unknown'}`;
9
+ exports.PORT_CONTENT = `${PORT_PREFIX}-content`;
10
+ exports.PORT_EXTENSION = `${PORT_PREFIX}-extension`;
11
+ exports.MESSAGE_ORIGIN_PAGE = `${PORT_PREFIX}-page`;
12
+ exports.MESSAGE_ORIGIN_CONTENT = `${PORT_PREFIX}-content`;
13
+ exports.ALLOWED_PATH = ['/', '/account/import-ledger', '/account/restore-json'];
14
+ exports.PASSWORD_EXPIRY_MIN = 15;
15
+ exports.PASSWORD_EXPIRY_MS = exports.PASSWORD_EXPIRY_MIN * 60 * 1000;
16
+ exports.PHISHING_PAGE_REDIRECT = '/phishing-page-detected';