@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.
- package/LICENSE +201 -0
- package/background/RequestBytesSign.js +6 -9
- package/background/RequestExtrinsicSign.js +6 -9
- package/background/handlers/Extension.js +304 -460
- package/background/handlers/State.js +365 -619
- package/background/handlers/Tabs.js +155 -273
- package/background/handlers/helpers.js +1 -3
- package/background/handlers/index.js +17 -22
- package/background/handlers/subscriptions.js +5 -9
- package/background/index.js +0 -2
- package/background/types.js +0 -2
- package/bundle.js +0 -2
- package/cjs/background/RequestBytesSign.d.ts +12 -0
- package/cjs/background/RequestBytesSign.js +15 -0
- package/cjs/background/RequestExtrinsicSign.d.ts +12 -0
- package/cjs/background/RequestExtrinsicSign.js +14 -0
- package/cjs/background/handlers/Extension.d.ts +49 -0
- package/cjs/background/handlers/Extension.js +492 -0
- package/cjs/background/handlers/State.d.ts +96 -0
- package/cjs/background/handlers/State.js +482 -0
- package/cjs/background/handlers/Tabs.d.ts +25 -0
- package/cjs/background/handlers/Tabs.js +199 -0
- package/cjs/background/handlers/helpers.d.ts +1 -0
- package/cjs/background/handlers/helpers.js +14 -0
- package/cjs/background/handlers/index.d.ts +3 -0
- package/cjs/background/handlers/index.js +46 -0
- package/cjs/background/handlers/subscriptions.d.ts +3 -0
- package/cjs/background/handlers/subscriptions.js +22 -0
- package/cjs/background/index.d.ts +1 -0
- package/cjs/background/index.js +7 -0
- package/cjs/background/types.d.ts +343 -0
- package/cjs/background/types.js +2 -0
- package/cjs/bundle.d.ts +1 -0
- package/cjs/bundle.js +5 -0
- package/cjs/defaults.d.ts +9 -0
- package/cjs/defaults.js +16 -0
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +4 -0
- package/cjs/package.json +3 -0
- package/cjs/packageDetect.d.ts +1 -0
- package/cjs/packageDetect.js +8 -0
- package/cjs/packageInfo.d.ts +6 -0
- package/cjs/packageInfo.js +4 -0
- package/cjs/page/Accounts.d.ts +7 -0
- package/cjs/page/Accounts.js +24 -0
- package/cjs/page/Injected.d.ts +13 -0
- package/cjs/page/Injected.js +25 -0
- package/cjs/page/Metadata.d.ts +7 -0
- package/cjs/page/Metadata.js +15 -0
- package/cjs/page/PostMessageProvider.d.ts +63 -0
- package/cjs/page/PostMessageProvider.js +135 -0
- package/cjs/page/Signer.d.ts +8 -0
- package/cjs/page/Signer.js +29 -0
- package/cjs/page/index.d.ts +16 -0
- package/cjs/page/index.js +52 -0
- package/cjs/page/types.d.ts +6 -0
- package/cjs/page/types.js +2 -0
- package/cjs/stores/Accounts.d.ts +6 -0
- package/cjs/stores/Accounts.js +21 -0
- package/cjs/stores/Base.d.ts +9 -0
- package/cjs/stores/Base.js +70 -0
- package/cjs/stores/Metadata.d.ts +5 -0
- package/cjs/stores/Metadata.js +13 -0
- package/cjs/stores/index.d.ts +2 -0
- package/cjs/stores/index.js +8 -0
- package/cjs/types.d.ts +9 -0
- package/cjs/types.js +2 -0
- package/cjs/utils/canDerive.d.ts +2 -0
- package/cjs/utils/canDerive.js +6 -0
- package/cjs/utils/getId.d.ts +1 -0
- package/cjs/utils/getId.js +8 -0
- package/cjs/utils/index.d.ts +1 -0
- package/cjs/utils/index.js +5 -0
- package/cjs/utils/portUtils.d.ts +13 -0
- package/cjs/utils/portUtils.js +49 -0
- package/defaults.js +10 -14
- package/index.js +0 -4
- package/package.json +464 -10
- package/packageDetect.js +0 -4
- package/packageInfo.js +1 -4
- package/page/Accounts.js +13 -18
- package/page/Injected.js +10 -10
- package/page/Metadata.js +8 -13
- package/page/PostMessageProvider.js +90 -192
- package/page/Signer.js +24 -90
- package/page/index.js +15 -72
- package/page/types.js +0 -2
- package/stores/Accounts.js +14 -80
- package/stores/Base.js +57 -240
- package/stores/Metadata.js +6 -26
- package/stores/index.js +0 -2
- package/types.js +0 -2
- package/utils/canDerive.js +0 -2
- package/utils/getId.js +2 -4
- package/utils/index.js +0 -2
- package/utils/portUtils.d.ts +0 -1
- package/utils/portUtils.js +31 -94
package/cjs/defaults.js
ADDED
|
@@ -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';
|
package/cjs/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './bundle.js';
|
package/cjs/index.js
ADDED
package/cjs/package.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const packageInfo_1 = require("@pezkuwi/extension-chains/cjs/packageInfo");
|
|
4
|
+
const packageInfo_2 = require("@pezkuwi/extension-dapp/cjs/packageInfo");
|
|
5
|
+
const packageInfo_3 = require("@pezkuwi/extension-inject/cjs/packageInfo");
|
|
6
|
+
const util_1 = require("@pezkuwi/util");
|
|
7
|
+
const packageInfo_js_1 = require("./packageInfo.js");
|
|
8
|
+
(0, util_1.detectPackage)(packageInfo_js_1.packageInfo, null, [packageInfo_1.packageInfo, packageInfo_2.packageInfo, packageInfo_3.packageInfo]);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { InjectedAccount, InjectedAccounts, Unsubcall } from '@pezkuwi/extension-inject/types';
|
|
2
|
+
import type { SendRequest } from './types.js';
|
|
3
|
+
export default class Accounts implements InjectedAccounts {
|
|
4
|
+
constructor(_sendRequest: SendRequest);
|
|
5
|
+
get(anyType?: boolean): Promise<InjectedAccount[]>;
|
|
6
|
+
subscribe(cb: (accounts: InjectedAccount[]) => unknown): Unsubcall;
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
let sendRequest;
|
|
4
|
+
class Accounts {
|
|
5
|
+
constructor(_sendRequest) {
|
|
6
|
+
sendRequest = _sendRequest;
|
|
7
|
+
}
|
|
8
|
+
get(anyType) {
|
|
9
|
+
return sendRequest('pub(accounts.list)', { anyType });
|
|
10
|
+
}
|
|
11
|
+
subscribe(cb) {
|
|
12
|
+
let id = null;
|
|
13
|
+
sendRequest('pub(accounts.subscribe)', null, cb)
|
|
14
|
+
.then((subId) => {
|
|
15
|
+
id = subId;
|
|
16
|
+
})
|
|
17
|
+
.catch(console.error);
|
|
18
|
+
return () => {
|
|
19
|
+
id && sendRequest('pub(accounts.unsubscribe)', { id })
|
|
20
|
+
.catch(console.error);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.default = Accounts;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Injected } from '@pezkuwi/extension-inject/types';
|
|
2
|
+
import type { SendRequest } from './types.js';
|
|
3
|
+
import Accounts from './Accounts.js';
|
|
4
|
+
import Metadata from './Metadata.js';
|
|
5
|
+
import PostMessageProvider from './PostMessageProvider.js';
|
|
6
|
+
import Signer from './Signer.js';
|
|
7
|
+
export default class implements Injected {
|
|
8
|
+
readonly accounts: Accounts;
|
|
9
|
+
readonly metadata: Metadata;
|
|
10
|
+
readonly provider: PostMessageProvider;
|
|
11
|
+
readonly signer: Signer;
|
|
12
|
+
constructor(sendRequest: SendRequest);
|
|
13
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const Accounts_js_1 = tslib_1.__importDefault(require("./Accounts.js"));
|
|
5
|
+
const Metadata_js_1 = tslib_1.__importDefault(require("./Metadata.js"));
|
|
6
|
+
const PostMessageProvider_js_1 = tslib_1.__importDefault(require("./PostMessageProvider.js"));
|
|
7
|
+
const Signer_js_1 = tslib_1.__importDefault(require("./Signer.js"));
|
|
8
|
+
class default_1 {
|
|
9
|
+
accounts;
|
|
10
|
+
metadata;
|
|
11
|
+
provider;
|
|
12
|
+
signer;
|
|
13
|
+
constructor(sendRequest) {
|
|
14
|
+
this.accounts = new Accounts_js_1.default(sendRequest);
|
|
15
|
+
this.metadata = new Metadata_js_1.default(sendRequest);
|
|
16
|
+
this.provider = new PostMessageProvider_js_1.default(sendRequest);
|
|
17
|
+
this.signer = new Signer_js_1.default(sendRequest);
|
|
18
|
+
setInterval(() => {
|
|
19
|
+
sendRequest('pub(ping)', null).catch(() => {
|
|
20
|
+
console.error('Extension unavailable, ping failed');
|
|
21
|
+
});
|
|
22
|
+
}, 5_000 + Math.floor(Math.random() * 5_000));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.default = default_1;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { InjectedMetadata, InjectedMetadataKnown, MetadataDef } from '@pezkuwi/extension-inject/types';
|
|
2
|
+
import type { SendRequest } from './types.js';
|
|
3
|
+
export default class Metadata implements InjectedMetadata {
|
|
4
|
+
constructor(_sendRequest: SendRequest);
|
|
5
|
+
get(): Promise<InjectedMetadataKnown[]>;
|
|
6
|
+
provide(definition: MetadataDef): Promise<boolean>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
let sendRequest;
|
|
4
|
+
class Metadata {
|
|
5
|
+
constructor(_sendRequest) {
|
|
6
|
+
sendRequest = _sendRequest;
|
|
7
|
+
}
|
|
8
|
+
get() {
|
|
9
|
+
return sendRequest('pub(metadata.list)');
|
|
10
|
+
}
|
|
11
|
+
provide(definition) {
|
|
12
|
+
return sendRequest('pub(metadata.provide)', definition);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.default = Metadata;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { InjectedProvider, ProviderList, ProviderMeta } from '@pezkuwi/extension-inject/types';
|
|
2
|
+
import type { ProviderInterfaceEmitCb, ProviderInterfaceEmitted } from '@pezkuwi/rpc-provider/types';
|
|
3
|
+
import type { AnyFunction } from '@pezkuwi/types/types';
|
|
4
|
+
import type { SendRequest } from './types.js';
|
|
5
|
+
type CallbackHandler = (error?: null | Error, value?: unknown) => void;
|
|
6
|
+
interface SubscriptionHandler {
|
|
7
|
+
callback: CallbackHandler;
|
|
8
|
+
type: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* @name PostMessageProvider
|
|
12
|
+
*
|
|
13
|
+
* @description Extension provider to be used by dapps
|
|
14
|
+
*/
|
|
15
|
+
export default class PostMessageProvider implements InjectedProvider {
|
|
16
|
+
#private;
|
|
17
|
+
/**
|
|
18
|
+
* @param {function} sendRequest The function to be called to send requests to the node
|
|
19
|
+
* @param {function} subscriptionNotificationHandler Channel for receiving subscription messages
|
|
20
|
+
*/
|
|
21
|
+
constructor(_sendRequest: SendRequest);
|
|
22
|
+
get isClonable(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* @description Returns a clone of the object
|
|
25
|
+
*/
|
|
26
|
+
clone(): PostMessageProvider;
|
|
27
|
+
/**
|
|
28
|
+
* @description Manually disconnect from the connection, clearing autoconnect logic
|
|
29
|
+
*/
|
|
30
|
+
connect(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* @description Manually disconnect from the connection, clearing autoconnect logic
|
|
33
|
+
*/
|
|
34
|
+
disconnect(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* @summary `true` when this provider supports subscriptions
|
|
37
|
+
*/
|
|
38
|
+
get hasSubscriptions(): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* @summary Whether the node is connected or not.
|
|
41
|
+
* @return {boolean} true if connected
|
|
42
|
+
*/
|
|
43
|
+
get isConnected(): boolean;
|
|
44
|
+
listProviders(): Promise<ProviderList>;
|
|
45
|
+
/**
|
|
46
|
+
* @summary Listens on events after having subscribed using the [[subscribe]] function.
|
|
47
|
+
* @param {ProviderInterfaceEmitted} type Event
|
|
48
|
+
* @param {ProviderInterfaceEmitCb} sub Callback
|
|
49
|
+
* @return unsubscribe function
|
|
50
|
+
*/
|
|
51
|
+
on(type: ProviderInterfaceEmitted, sub: ProviderInterfaceEmitCb): () => void;
|
|
52
|
+
send(method: string, params: unknown[], _?: boolean, subscription?: SubscriptionHandler): Promise<any>;
|
|
53
|
+
/**
|
|
54
|
+
* @summary Spawn a provider on the extension background.
|
|
55
|
+
*/
|
|
56
|
+
startProvider(key: string): Promise<ProviderMeta>;
|
|
57
|
+
subscribe(type: string, method: string, params: unknown[], callback: AnyFunction): Promise<number>;
|
|
58
|
+
/**
|
|
59
|
+
* @summary Allows unsubscribing to subscriptions made with [[subscribe]].
|
|
60
|
+
*/
|
|
61
|
+
unsubscribe(type: string, method: string, id: number): Promise<boolean>;
|
|
62
|
+
}
|
|
63
|
+
export {};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const eventemitter3_1 = require("eventemitter3");
|
|
4
|
+
const util_1 = require("@pezkuwi/util");
|
|
5
|
+
const l = (0, util_1.logger)('PostMessageProvider');
|
|
6
|
+
let sendRequest;
|
|
7
|
+
/**
|
|
8
|
+
* @name PostMessageProvider
|
|
9
|
+
*
|
|
10
|
+
* @description Extension provider to be used by dapps
|
|
11
|
+
*/
|
|
12
|
+
class PostMessageProvider {
|
|
13
|
+
#eventemitter;
|
|
14
|
+
// Whether or not the actual extension background provider is connected
|
|
15
|
+
#isConnected = false;
|
|
16
|
+
// Subscription IDs are (historically) not guaranteed to be globally unique;
|
|
17
|
+
// only unique for a given subscription method; which is why we identify
|
|
18
|
+
// the subscriptions based on subscription id + type
|
|
19
|
+
#subscriptions = {}; // {[(type,subscriptionId)]: callback}
|
|
20
|
+
/**
|
|
21
|
+
* @param {function} sendRequest The function to be called to send requests to the node
|
|
22
|
+
* @param {function} subscriptionNotificationHandler Channel for receiving subscription messages
|
|
23
|
+
*/
|
|
24
|
+
constructor(_sendRequest) {
|
|
25
|
+
this.#eventemitter = new eventemitter3_1.EventEmitter();
|
|
26
|
+
sendRequest = _sendRequest;
|
|
27
|
+
}
|
|
28
|
+
get isClonable() {
|
|
29
|
+
return !!true;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* @description Returns a clone of the object
|
|
33
|
+
*/
|
|
34
|
+
clone() {
|
|
35
|
+
return new PostMessageProvider(sendRequest);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @description Manually disconnect from the connection, clearing autoconnect logic
|
|
39
|
+
*/
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
41
|
+
async connect() {
|
|
42
|
+
// FIXME This should see if the extension's state's provider can disconnect
|
|
43
|
+
console.error('PostMessageProvider.disconnect() is not implemented.');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @description Manually disconnect from the connection, clearing autoconnect logic
|
|
47
|
+
*/
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
49
|
+
async disconnect() {
|
|
50
|
+
// FIXME This should see if the extension's state's provider can disconnect
|
|
51
|
+
console.error('PostMessageProvider.disconnect() is not implemented.');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @summary `true` when this provider supports subscriptions
|
|
55
|
+
*/
|
|
56
|
+
get hasSubscriptions() {
|
|
57
|
+
// FIXME This should see if the extension's state's provider has subscriptions
|
|
58
|
+
return !!true;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* @summary Whether the node is connected or not.
|
|
62
|
+
* @return {boolean} true if connected
|
|
63
|
+
*/
|
|
64
|
+
get isConnected() {
|
|
65
|
+
return this.#isConnected;
|
|
66
|
+
}
|
|
67
|
+
listProviders() {
|
|
68
|
+
return sendRequest('pub(rpc.listProviders)', undefined);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* @summary Listens on events after having subscribed using the [[subscribe]] function.
|
|
72
|
+
* @param {ProviderInterfaceEmitted} type Event
|
|
73
|
+
* @param {ProviderInterfaceEmitCb} sub Callback
|
|
74
|
+
* @return unsubscribe function
|
|
75
|
+
*/
|
|
76
|
+
on(type, sub) {
|
|
77
|
+
this.#eventemitter.on(type, sub);
|
|
78
|
+
return () => {
|
|
79
|
+
this.#eventemitter.removeListener(type, sub);
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
83
|
+
async send(method, params, _, subscription) {
|
|
84
|
+
if (subscription) {
|
|
85
|
+
const { callback, type } = subscription;
|
|
86
|
+
const id = await sendRequest('pub(rpc.subscribe)', { method, params, type }, (res) => {
|
|
87
|
+
subscription.callback(null, res);
|
|
88
|
+
});
|
|
89
|
+
this.#subscriptions[`${type}::${id}`] = callback;
|
|
90
|
+
return id;
|
|
91
|
+
}
|
|
92
|
+
return sendRequest('pub(rpc.send)', { method, params });
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* @summary Spawn a provider on the extension background.
|
|
96
|
+
*/
|
|
97
|
+
async startProvider(key) {
|
|
98
|
+
// Disconnect from the previous provider
|
|
99
|
+
this.#isConnected = false;
|
|
100
|
+
this.#eventemitter.emit('disconnected');
|
|
101
|
+
const meta = await sendRequest('pub(rpc.startProvider)', key);
|
|
102
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
103
|
+
sendRequest('pub(rpc.subscribeConnected)', null, (connected) => {
|
|
104
|
+
this.#isConnected = connected;
|
|
105
|
+
if (connected) {
|
|
106
|
+
this.#eventemitter.emit('connected');
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
this.#eventemitter.emit('disconnected');
|
|
110
|
+
}
|
|
111
|
+
return true;
|
|
112
|
+
});
|
|
113
|
+
return meta;
|
|
114
|
+
}
|
|
115
|
+
subscribe(type, method, params, callback) {
|
|
116
|
+
return this.send(method, params, false, { callback, type });
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* @summary Allows unsubscribing to subscriptions made with [[subscribe]].
|
|
120
|
+
*/
|
|
121
|
+
async unsubscribe(type, method, id) {
|
|
122
|
+
const subscription = `${type}::${id}`;
|
|
123
|
+
// FIXME This now could happen with re-subscriptions. The issue is that with a re-sub
|
|
124
|
+
// the assigned id now does not match what the API user originally received. It has
|
|
125
|
+
// a slight complication in solving - since we cannot rely on the send id, but rather
|
|
126
|
+
// need to find the actual subscription id to map it
|
|
127
|
+
if ((0, util_1.isUndefined)(this.#subscriptions[subscription])) {
|
|
128
|
+
l.debug(() => `Unable to find active subscription=${subscription}`);
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
delete this.#subscriptions[subscription];
|
|
132
|
+
return this.send(method, [id]);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.default = PostMessageProvider;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Signer as SignerInterface, SignerResult } from '@pezkuwi/api/types';
|
|
2
|
+
import type { SignerPayloadJSON, SignerPayloadRaw } from '@pezkuwi/types/types';
|
|
3
|
+
import type { SendRequest } from './types.js';
|
|
4
|
+
export default class Signer implements SignerInterface {
|
|
5
|
+
constructor(_sendRequest: SendRequest);
|
|
6
|
+
signPayload(payload: SignerPayloadJSON): Promise<SignerResult>;
|
|
7
|
+
signRaw(payload: SignerPayloadRaw): Promise<SignerResult>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
let sendRequest;
|
|
4
|
+
let nextId = 0;
|
|
5
|
+
class Signer {
|
|
6
|
+
constructor(_sendRequest) {
|
|
7
|
+
sendRequest = _sendRequest;
|
|
8
|
+
}
|
|
9
|
+
async signPayload(payload) {
|
|
10
|
+
const id = ++nextId;
|
|
11
|
+
const result = await sendRequest('pub(extrinsic.sign)', payload);
|
|
12
|
+
// we add an internal id (number) - should have a mapping from the
|
|
13
|
+
// extension id (string) -> internal id (number) if we wish to provide
|
|
14
|
+
// updated via the update functionality (noop at this point)
|
|
15
|
+
return {
|
|
16
|
+
...result,
|
|
17
|
+
id
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
async signRaw(payload) {
|
|
21
|
+
const id = ++nextId;
|
|
22
|
+
const result = await sendRequest('pub(bytes.sign)', payload);
|
|
23
|
+
return {
|
|
24
|
+
...result,
|
|
25
|
+
id
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.default = Signer;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { MessageTypes, MessageTypesWithNoSubscriptions, MessageTypesWithNullRequest, MessageTypesWithSubscriptions, RequestTypes, ResponseTypes, SubscriptionMessageTypes, TransportResponseMessage } from '../background/types.js';
|
|
2
|
+
import Injected from './Injected.js';
|
|
3
|
+
export interface Handler {
|
|
4
|
+
resolve: (data?: any) => void;
|
|
5
|
+
reject: (error: Error) => void;
|
|
6
|
+
subscriber?: (data: any) => void;
|
|
7
|
+
}
|
|
8
|
+
export type Handlers = Record<string, Handler>;
|
|
9
|
+
export declare function sendMessage<TMessageType extends MessageTypesWithNullRequest>(message: TMessageType): Promise<ResponseTypes[TMessageType]>;
|
|
10
|
+
export declare function sendMessage<TMessageType extends MessageTypesWithNoSubscriptions>(message: TMessageType, request: RequestTypes[TMessageType]): Promise<ResponseTypes[TMessageType]>;
|
|
11
|
+
export declare function sendMessage<TMessageType extends MessageTypesWithSubscriptions>(message: TMessageType, request: RequestTypes[TMessageType], subscriber: (data: SubscriptionMessageTypes[TMessageType]) => void): Promise<ResponseTypes[TMessageType]>;
|
|
12
|
+
export declare function enable(origin: string): Promise<Injected>;
|
|
13
|
+
export declare function redirectIfPhishing(): Promise<boolean>;
|
|
14
|
+
export declare function handleResponse<TMessageType extends MessageTypes>(data: TransportResponseMessage<TMessageType> & {
|
|
15
|
+
subscription?: string;
|
|
16
|
+
}): void;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sendMessage = sendMessage;
|
|
4
|
+
exports.enable = enable;
|
|
5
|
+
exports.redirectIfPhishing = redirectIfPhishing;
|
|
6
|
+
exports.handleResponse = handleResponse;
|
|
7
|
+
const tslib_1 = require("tslib");
|
|
8
|
+
const defaults_js_1 = require("../defaults.js");
|
|
9
|
+
const getId_js_1 = require("../utils/getId.js");
|
|
10
|
+
const Injected_js_1 = tslib_1.__importDefault(require("./Injected.js"));
|
|
11
|
+
const handlers = {};
|
|
12
|
+
function sendMessage(message, request, subscriber) {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
const id = (0, getId_js_1.getId)();
|
|
15
|
+
handlers[id] = { reject, resolve, subscriber };
|
|
16
|
+
const transportRequestMessage = {
|
|
17
|
+
id,
|
|
18
|
+
message,
|
|
19
|
+
origin: defaults_js_1.MESSAGE_ORIGIN_PAGE,
|
|
20
|
+
request: request || null
|
|
21
|
+
};
|
|
22
|
+
window.postMessage(transportRequestMessage, '*');
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async function enable(origin) {
|
|
26
|
+
await sendMessage('pub(authorize.tab)', { origin });
|
|
27
|
+
return new Injected_js_1.default(sendMessage);
|
|
28
|
+
}
|
|
29
|
+
async function redirectIfPhishing() {
|
|
30
|
+
const res = await sendMessage('pub(phishing.redirectIfDenied)');
|
|
31
|
+
return res;
|
|
32
|
+
}
|
|
33
|
+
function handleResponse(data) {
|
|
34
|
+
const handler = handlers[data.id];
|
|
35
|
+
if (!handler) {
|
|
36
|
+
console.error(`Unknown response: ${JSON.stringify(data)}`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (!handler.subscriber) {
|
|
40
|
+
delete handlers[data.id];
|
|
41
|
+
}
|
|
42
|
+
if (data.subscription) {
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
44
|
+
handler.subscriber(data.subscription);
|
|
45
|
+
}
|
|
46
|
+
else if (data.error) {
|
|
47
|
+
handler.reject(new Error(data.error));
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
handler.resolve(data.response);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { MessageTypesWithNoSubscriptions, MessageTypesWithNullRequest, MessageTypesWithSubscriptions, RequestTypes, ResponseTypes, SubscriptionMessageTypes } from '../background/types.js';
|
|
2
|
+
export interface SendRequest {
|
|
3
|
+
<TMessageType extends MessageTypesWithNullRequest>(message: TMessageType): Promise<ResponseTypes[TMessageType]>;
|
|
4
|
+
<TMessageType extends MessageTypesWithNoSubscriptions>(message: TMessageType, request: RequestTypes[TMessageType]): Promise<ResponseTypes[TMessageType]>;
|
|
5
|
+
<TMessageType extends MessageTypesWithSubscriptions>(message: TMessageType, request: RequestTypes[TMessageType], subscriber: (data: SubscriptionMessageTypes[TMessageType]) => void): Promise<ResponseTypes[TMessageType]>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { KeyringJson, KeyringStore } from '@pezkuwi/ui-keyring/types';
|
|
2
|
+
import BaseStore from './Base.js';
|
|
3
|
+
export default class AccountsStore extends BaseStore<KeyringJson> implements KeyringStore {
|
|
4
|
+
constructor();
|
|
5
|
+
set(key: string, value: KeyringJson, update?: () => void): Promise<void>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const defaults_js_1 = require("../defaults.js");
|
|
5
|
+
const Base_js_1 = tslib_1.__importDefault(require("./Base.js"));
|
|
6
|
+
class AccountsStore extends Base_js_1.default {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(defaults_js_1.EXTENSION_PREFIX && defaults_js_1.EXTENSION_PREFIX !== 'polkadot{.js}'
|
|
9
|
+
? `${defaults_js_1.EXTENSION_PREFIX}accounts`
|
|
10
|
+
: null);
|
|
11
|
+
}
|
|
12
|
+
async set(key, value, update) {
|
|
13
|
+
// shortcut, don't save testing accounts in extension storage
|
|
14
|
+
if (key.startsWith('account:') && value.meta && value.meta.isTesting) {
|
|
15
|
+
update && update();
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
await super.set(key, value, update);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.default = AccountsStore;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export default abstract class BaseStore<T> {
|
|
2
|
+
#private;
|
|
3
|
+
constructor(prefix: string | null);
|
|
4
|
+
all(update: (key: string, value: T) => void): Promise<void>;
|
|
5
|
+
allMap(update: (value: Record<string, T>) => Promise<void>): Promise<void>;
|
|
6
|
+
get(key: string, update: (value: T) => void): Promise<void>;
|
|
7
|
+
remove(key: string, update?: () => void): Promise<void>;
|
|
8
|
+
set(key: string, value: T, update?: () => void): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const lastError = (type) => {
|
|
4
|
+
const error = chrome.runtime.lastError;
|
|
5
|
+
if (error) {
|
|
6
|
+
console.error(`BaseStore.${type}:: runtime.lastError:`, error);
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
class BaseStore {
|
|
10
|
+
#prefix;
|
|
11
|
+
constructor(prefix) {
|
|
12
|
+
this.#prefix = prefix ? `${prefix}:` : '';
|
|
13
|
+
}
|
|
14
|
+
async all(update) {
|
|
15
|
+
await this.allMap(async (map) => {
|
|
16
|
+
const entries = Object.entries(map);
|
|
17
|
+
for (const [key, value] of entries) {
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/await-thenable
|
|
19
|
+
await update(key, value);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async allMap(update) {
|
|
24
|
+
await chrome.storage.local.get(null).then(async (result) => {
|
|
25
|
+
lastError('all');
|
|
26
|
+
const entries = Object.entries(result);
|
|
27
|
+
const map = {};
|
|
28
|
+
for (let i = 0, count = entries.length; i < count; i++) {
|
|
29
|
+
const [key, value] = entries[i];
|
|
30
|
+
if (key.startsWith(this.#prefix)) {
|
|
31
|
+
map[key.replace(this.#prefix, '')] = value;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
await update(map);
|
|
35
|
+
}).catch(({ message }) => {
|
|
36
|
+
console.error(`BaseStore error within allMap: ${message}`);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async get(key, update) {
|
|
40
|
+
const prefixedKey = `${this.#prefix}${key}`;
|
|
41
|
+
await chrome.storage.local.get([prefixedKey]).then(async (result) => {
|
|
42
|
+
lastError('get');
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/await-thenable
|
|
44
|
+
await update(result[prefixedKey]);
|
|
45
|
+
}).catch(({ message }) => {
|
|
46
|
+
console.error(`BaseStore error within get: ${message}`);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async remove(key, update) {
|
|
50
|
+
const prefixedKey = `${this.#prefix}${key}`;
|
|
51
|
+
await chrome.storage.local.remove(prefixedKey).then(async () => {
|
|
52
|
+
lastError('remove');
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/await-thenable
|
|
54
|
+
update && await update();
|
|
55
|
+
}).catch(({ message }) => {
|
|
56
|
+
console.error(`BaseStore error within remove: ${message}`);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async set(key, value, update) {
|
|
60
|
+
const prefixedKey = `${this.#prefix}${key}`;
|
|
61
|
+
await chrome.storage.local.set({ [prefixedKey]: value }).then(async () => {
|
|
62
|
+
lastError('set');
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/await-thenable
|
|
64
|
+
update && await update();
|
|
65
|
+
}).catch(({ message }) => {
|
|
66
|
+
console.error(`BaseStore error within set: ${message}`);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.default = BaseStore;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const defaults_js_1 = require("../defaults.js");
|
|
5
|
+
const Base_js_1 = tslib_1.__importDefault(require("./Base.js"));
|
|
6
|
+
class MetadataStore extends Base_js_1.default {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(defaults_js_1.EXTENSION_PREFIX && defaults_js_1.EXTENSION_PREFIX !== 'polkadot{.js}'
|
|
9
|
+
? `${defaults_js_1.EXTENSION_PREFIX}metadata`
|
|
10
|
+
: 'metadata');
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.default = MetadataStore;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MetadataStore = exports.AccountsStore = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
var Accounts_js_1 = require("./Accounts.js");
|
|
6
|
+
Object.defineProperty(exports, "AccountsStore", { enumerable: true, get: function () { return tslib_1.__importDefault(Accounts_js_1).default; } });
|
|
7
|
+
var Metadata_js_1 = require("./Metadata.js");
|
|
8
|
+
Object.defineProperty(exports, "MetadataStore", { enumerable: true, get: function () { return tslib_1.__importDefault(Metadata_js_1).default; } });
|
package/cjs/types.d.ts
ADDED
package/cjs/types.js
ADDED