@subwallet/extension-base 0.3.6-0 → 0.3.6-1
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/{build/background → background}/KoniTypes.d.ts +0 -0
- package/{build/background → background}/KoniTypes.js +0 -0
- package/{build/background → background}/RequestBytesSign.d.ts +0 -0
- package/{build/background → background}/RequestBytesSign.js +0 -0
- package/{build/background → background}/RequestExtrinsicSign.d.ts +0 -0
- package/{build/background → background}/RequestExtrinsicSign.js +0 -0
- package/{build/background → background}/handlers/Extension.d.ts +0 -0
- package/{build/background → background}/handlers/Extension.js +0 -0
- package/{build/background → background}/handlers/State.d.ts +0 -0
- package/{build/background → background}/handlers/State.js +0 -0
- package/{build/background → background}/handlers/Tabs.d.ts +0 -0
- package/{build/background → background}/handlers/Tabs.js +0 -0
- package/{build/background → background}/handlers/helpers.d.ts +0 -0
- package/{build/background → background}/handlers/helpers.js +0 -0
- package/{build/background → background}/handlers/index.d.ts +0 -0
- package/{build/background → background}/handlers/index.js +0 -0
- package/{build/background → background}/handlers/subscriptions.d.ts +0 -0
- package/{build/background → background}/handlers/subscriptions.js +0 -0
- package/{build/background → background}/types.d.ts +0 -0
- package/{build/background → background}/types.js +0 -0
- package/{build/bundle.d.ts → bundle.d.ts} +0 -0
- package/{build/bundle.js → bundle.js} +0 -0
- package/{build-cjs → cjs}/background/KoniTypes.js +0 -0
- package/{build-cjs → cjs}/background/RequestBytesSign.js +0 -0
- package/{build-cjs → cjs}/background/RequestExtrinsicSign.js +0 -0
- package/{build-cjs → cjs}/background/handlers/Extension.js +0 -0
- package/{build-cjs → cjs}/background/handlers/State.js +0 -0
- package/{build-cjs → cjs}/background/handlers/Tabs.js +0 -0
- package/{build-cjs → cjs}/background/handlers/helpers.js +0 -0
- package/{build-cjs → cjs}/background/handlers/index.js +0 -0
- package/{build-cjs → cjs}/background/handlers/subscriptions.js +0 -0
- package/{build-cjs → cjs}/background/types.js +0 -0
- package/{build-cjs → cjs}/bundle.js +0 -0
- package/{build-cjs → cjs}/defaults.js +0 -0
- package/{build-cjs → cjs}/detectOther.js +0 -0
- package/{build-cjs → cjs}/detectPackage.js +0 -0
- package/{build-cjs → cjs}/index.js +0 -0
- package/{build/cjs → cjs}/package.json +0 -0
- package/{build-cjs → cjs}/packageInfo.js +0 -0
- package/{build-cjs → cjs}/page/Accounts.js +0 -0
- package/{build-cjs → cjs}/page/Injected.js +0 -0
- package/{build-cjs → cjs}/page/Metadata.js +0 -0
- package/{build-cjs → cjs}/page/PostMessageProvider.js +0 -0
- package/{build-cjs → cjs}/page/Signer.js +0 -0
- package/{build-cjs → cjs}/page/index.js +0 -0
- package/{build-cjs → cjs}/page/types.js +0 -0
- package/{build-cjs → cjs}/stores/Accounts.js +0 -0
- package/{build-cjs → cjs}/stores/Base.js +0 -0
- package/{build-cjs → cjs}/stores/Metadata.js +0 -0
- package/{build-cjs → cjs}/stores/index.js +0 -0
- package/{build-cjs → cjs}/types.js +0 -0
- package/{build-cjs → cjs}/utils/canDerive.js +0 -0
- package/{build-cjs → cjs}/utils/getId.js +0 -0
- package/{build-cjs → cjs}/utils/index.js +0 -0
- package/{build/defaults.d.ts → defaults.d.ts} +0 -0
- package/{build/defaults.js → defaults.js} +0 -0
- package/{build/detectOther.d.ts → detectOther.d.ts} +0 -0
- package/{build/detectOther.js → detectOther.js} +0 -0
- package/{build/detectPackage.d.ts → detectPackage.d.ts} +0 -0
- package/{build/detectPackage.js → detectPackage.js} +0 -0
- package/{build/index.d.ts → index.d.ts} +0 -0
- package/{build/index.js → index.js} +0 -0
- package/package.json +171 -7
- package/{build/packageInfo.d.ts → packageInfo.d.ts} +0 -0
- package/{build/packageInfo.js → packageInfo.js} +0 -0
- package/{build/page → page}/Accounts.d.ts +0 -0
- package/{build/page → page}/Accounts.js +0 -0
- package/{build/page → page}/Injected.d.ts +0 -0
- package/{build/page → page}/Injected.js +0 -0
- package/{build/page → page}/Metadata.d.ts +0 -0
- package/{build/page → page}/Metadata.js +0 -0
- package/{build/page → page}/PostMessageProvider.d.ts +0 -0
- package/{build/page → page}/PostMessageProvider.js +0 -0
- package/{build/page → page}/Signer.d.ts +0 -0
- package/{build/page → page}/Signer.js +0 -0
- package/{build/page → page}/index.d.ts +0 -0
- package/{build/page → page}/index.js +0 -0
- package/{build/page → page}/types.d.ts +0 -0
- package/{build/page → page}/types.js +0 -0
- package/{build/stores → stores}/Accounts.d.ts +0 -0
- package/{build/stores → stores}/Accounts.js +0 -0
- package/{build/stores → stores}/Base.d.ts +0 -0
- package/{build/stores → stores}/Base.js +0 -0
- package/{build/stores → stores}/Metadata.d.ts +0 -0
- package/{build/stores → stores}/Metadata.js +0 -0
- package/{build/stores → stores}/index.d.ts +0 -0
- package/{build/stores → stores}/index.js +0 -0
- package/{build/types.d.ts → types.d.ts} +0 -0
- package/{build/types.js → types.js} +0 -0
- package/{build/utils → utils}/canDerive.d.ts +0 -0
- package/{build/utils → utils}/canDerive.js +0 -0
- package/{build/utils → utils}/getId.d.ts +0 -0
- package/{build/utils → utils}/getId.js +0 -0
- package/{build/utils → utils}/index.d.ts +0 -0
- package/{build/utils → utils}/index.js +0 -0
- package/build/LICENSE +0 -201
- package/build/README.md +0 -10
- package/build/cjs/background/KoniTypes.js +0 -69
- package/build/cjs/background/RequestBytesSign.js +0 -27
- package/build/cjs/background/RequestExtrinsicSign.js +0 -23
- package/build/cjs/background/handlers/Extension.js +0 -764
- package/build/cjs/background/handlers/State.js +0 -472
- package/build/cjs/background/handlers/Tabs.js +0 -273
- package/build/cjs/background/handlers/helpers.js +0 -20
- package/build/cjs/background/handlers/index.js +0 -60
- package/build/cjs/background/handlers/subscriptions.js +0 -32
- package/build/cjs/background/types.js +0 -1
- package/build/cjs/bundle.js +0 -13
- package/build/cjs/defaults.js +0 -26
- package/build/cjs/detectOther.js +0 -17
- package/build/cjs/detectPackage.js +0 -14
- package/build/cjs/index.js +0 -18
- package/build/cjs/packageInfo.js +0 -16
- package/build/cjs/page/Accounts.js +0 -31
- package/build/cjs/page/Injected.js +0 -30
- package/build/cjs/page/Metadata.js +0 -27
- package/build/cjs/page/PostMessageProvider.js +0 -184
- package/build/cjs/page/Signer.js +0 -44
- package/build/cjs/page/index.js +0 -76
- package/build/cjs/page/types.js +0 -1
- package/build/cjs/stores/Accounts.js +0 -33
- package/build/cjs/stores/Base.js +0 -84
- package/build/cjs/stores/Metadata.js +0 -23
- package/build/cjs/stores/index.js +0 -23
- package/build/cjs/types.js +0 -1
- package/build/cjs/utils/canDerive.js +0 -12
- package/build/cjs/utils/getId.js +0 -16
- package/build/cjs/utils/index.js +0 -13
- package/build/package.json +0 -210
- package/src/background/KoniTypes.ts +0 -537
- package/src/background/RequestBytesSign.ts +0 -30
- package/src/background/RequestExtrinsicSign.ts +0 -23
- package/src/background/handlers/Extension.spec.ts +0 -456
- package/src/background/handlers/Extension.ts +0 -627
- package/src/background/handlers/State.ts +0 -513
- package/src/background/handlers/Tabs.ts +0 -223
- package/src/background/handlers/helpers.ts +0 -14
- package/src/background/handlers/index.ts +0 -49
- package/src/background/handlers/subscriptions.ts +0 -30
- package/src/background/types.ts +0 -437
- package/src/bundle.ts +0 -4
- package/src/defaults.ts +0 -24
- package/src/detectOther.ts +0 -8
- package/src/detectPackage.ts +0 -11
- package/src/index.ts +0 -7
- package/src/packageInfo.ts +0 -6
- package/src/page/Accounts.ts +0 -27
- package/src/page/Injected.ts +0 -27
- package/src/page/Metadata.ts +0 -22
- package/src/page/PostMessageProvider.ts +0 -178
- package/src/page/Signer.ts +0 -45
- package/src/page/index.ts +0 -87
- package/src/page/types.ts +0 -10
- package/src/stores/Accounts.ts +0 -24
- package/src/stores/Base.ts +0 -81
- package/src/stores/Metadata.ts +0 -13
- package/src/stores/index.ts +0 -5
- package/src/types.ts +0 -12
- package/src/utils/canDerive.ts +0 -8
- package/src/utils/getId.ts +0 -10
- package/src/utils/index.ts +0 -4
- package/tsconfig.build.json +0 -18
- package/tsconfig.build.tsbuildinfo +0 -1
- package/tsconfig.json +0 -14
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
// Copyright 2019-2022 @subwallet/extension authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
|
-
import type { InjectedAccount, InjectedMetadataKnown, MetadataDef, ProviderMeta } from '@subwallet/extension-inject/types';
|
|
5
|
-
import type { KeyringPair } from '@polkadot/keyring/types';
|
|
6
|
-
import type { JsonRpcResponse } from '@polkadot/rpc-provider/types';
|
|
7
|
-
import type { SignerPayloadJSON, SignerPayloadRaw } from '@polkadot/types/types';
|
|
8
|
-
import type { SubjectInfo } from '@polkadot/ui-keyring/observable/types';
|
|
9
|
-
import type { MessageTypes, RequestAccountList, RequestAuthorizeTab, RequestRpcSend, RequestRpcSubscribe, RequestRpcUnsubscribe, RequestTypes, ResponseRpcListProviders, ResponseSigning, ResponseTypes, SubscriptionMessageTypes } from '../types';
|
|
10
|
-
|
|
11
|
-
import { PHISHING_PAGE_REDIRECT } from '@subwallet/extension-base/defaults';
|
|
12
|
-
import { canDerive } from '@subwallet/extension-base/utils';
|
|
13
|
-
|
|
14
|
-
import { checkIfDenied } from '@polkadot/phishing';
|
|
15
|
-
import keyring from '@polkadot/ui-keyring';
|
|
16
|
-
import { accounts as accountsObservable } from '@polkadot/ui-keyring/observable/accounts';
|
|
17
|
-
import { assert, isNumber } from '@polkadot/util';
|
|
18
|
-
|
|
19
|
-
import RequestBytesSign from '../RequestBytesSign';
|
|
20
|
-
import RequestExtrinsicSign from '../RequestExtrinsicSign';
|
|
21
|
-
import { withErrorLog } from './helpers';
|
|
22
|
-
import State from './State';
|
|
23
|
-
import { createSubscription, unsubscribe } from './subscriptions';
|
|
24
|
-
|
|
25
|
-
function transformAccounts (accounts: SubjectInfo, anyType = false): InjectedAccount[] {
|
|
26
|
-
return Object
|
|
27
|
-
.values(accounts)
|
|
28
|
-
.filter(({ json: { meta: { isHidden } } }) => !isHidden)
|
|
29
|
-
.filter(({ type }) => anyType ? true : canDerive(type))
|
|
30
|
-
.filter(({ type }) => (type !== 'ethereum')) // Quick fix DApp not allow EVM
|
|
31
|
-
.sort((a, b) => (a.json.meta.whenCreated || 0) - (b.json.meta.whenCreated || 0))
|
|
32
|
-
.map(({ json: { address, meta: { genesisHash, name } }, type }): InjectedAccount => ({
|
|
33
|
-
address,
|
|
34
|
-
genesisHash,
|
|
35
|
-
name,
|
|
36
|
-
type
|
|
37
|
-
}));
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export default class Tabs {
|
|
41
|
-
readonly #state: State;
|
|
42
|
-
|
|
43
|
-
constructor (state: State) {
|
|
44
|
-
this.#state = state;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
private authorize (url: string, request: RequestAuthorizeTab): Promise<boolean> {
|
|
48
|
-
return this.#state.authorizeUrl(url, request);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
52
|
-
private accountsList (url: string, { anyType }: RequestAccountList): InjectedAccount[] {
|
|
53
|
-
return transformAccounts(accountsObservable.subject.getValue(), anyType);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// FIXME This looks very much like what we have in Extension
|
|
57
|
-
private accountsSubscribe (url: string, id: string, port: chrome.runtime.Port): boolean {
|
|
58
|
-
const cb = createSubscription<'pub(accounts.subscribe)'>(id, port);
|
|
59
|
-
const subscription = accountsObservable.subject.subscribe((accounts: SubjectInfo): void =>
|
|
60
|
-
cb(transformAccounts(accounts))
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
port.onDisconnect.addListener((): void => {
|
|
64
|
-
unsubscribe(id);
|
|
65
|
-
subscription.unsubscribe();
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
private getSigningPair (address: string): KeyringPair {
|
|
72
|
-
const pair = keyring.getPair(address);
|
|
73
|
-
|
|
74
|
-
assert(pair, 'Unable to find keypair');
|
|
75
|
-
|
|
76
|
-
return pair;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
private bytesSign (url: string, request: SignerPayloadRaw): Promise<ResponseSigning> {
|
|
80
|
-
const address = request.address;
|
|
81
|
-
const pair = this.getSigningPair(address);
|
|
82
|
-
|
|
83
|
-
return this.#state.sign(url, new RequestBytesSign(request), { address, ...pair.meta });
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
private extrinsicSign (url: string, request: SignerPayloadJSON): Promise<ResponseSigning> {
|
|
87
|
-
const address = request.address;
|
|
88
|
-
const pair = this.getSigningPair(address);
|
|
89
|
-
|
|
90
|
-
return this.#state.sign(url, new RequestExtrinsicSign(request), { address, ...pair.meta });
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
private metadataProvide (url: string, request: MetadataDef): Promise<boolean> {
|
|
94
|
-
return this.#state.injectMetadata(url, request);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
98
|
-
private metadataList (url: string): InjectedMetadataKnown[] {
|
|
99
|
-
return this.#state.knownMetadata.map(({ genesisHash, specVersion }) => ({
|
|
100
|
-
genesisHash,
|
|
101
|
-
specVersion
|
|
102
|
-
}));
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
private rpcListProviders (): Promise<ResponseRpcListProviders> {
|
|
106
|
-
return this.#state.rpcListProviders();
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
private rpcSend (request: RequestRpcSend, port: chrome.runtime.Port): Promise<JsonRpcResponse> {
|
|
110
|
-
return this.#state.rpcSend(request, port);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
private rpcStartProvider (key: string, port: chrome.runtime.Port): Promise<ProviderMeta> {
|
|
114
|
-
return this.#state.rpcStartProvider(key, port);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
private async rpcSubscribe (request: RequestRpcSubscribe, id: string, port: chrome.runtime.Port): Promise<boolean> {
|
|
118
|
-
const innerCb = createSubscription<'pub(rpc.subscribe)'>(id, port);
|
|
119
|
-
const cb = (_error: Error | null, data: SubscriptionMessageTypes['pub(rpc.subscribe)']): void => innerCb(data);
|
|
120
|
-
const subscriptionId = await this.#state.rpcSubscribe(request, cb, port);
|
|
121
|
-
|
|
122
|
-
port.onDisconnect.addListener((): void => {
|
|
123
|
-
unsubscribe(id);
|
|
124
|
-
withErrorLog(() => this.rpcUnsubscribe({ ...request, subscriptionId }, port));
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
return true;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
private rpcSubscribeConnected (request: null, id: string, port: chrome.runtime.Port): Promise<boolean> {
|
|
131
|
-
const innerCb = createSubscription<'pub(rpc.subscribeConnected)'>(id, port);
|
|
132
|
-
const cb = (_error: Error | null, data: SubscriptionMessageTypes['pub(rpc.subscribeConnected)']): void => innerCb(data);
|
|
133
|
-
|
|
134
|
-
this.#state.rpcSubscribeConnected(request, cb, port);
|
|
135
|
-
|
|
136
|
-
port.onDisconnect.addListener((): void => {
|
|
137
|
-
unsubscribe(id);
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
return Promise.resolve(true);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
private async rpcUnsubscribe (request: RequestRpcUnsubscribe, port: chrome.runtime.Port): Promise<boolean> {
|
|
144
|
-
return this.#state.rpcUnsubscribe(request, port);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
private redirectPhishingLanding (phishingWebsite: string): void {
|
|
148
|
-
const nonFragment = phishingWebsite.split('#')[0];
|
|
149
|
-
const encodedWebsite = encodeURIComponent(nonFragment);
|
|
150
|
-
const url = `${chrome.extension.getURL('index.html')}#${PHISHING_PAGE_REDIRECT}/${encodedWebsite}`;
|
|
151
|
-
|
|
152
|
-
chrome.tabs.query({ url: nonFragment }, (tabs) => {
|
|
153
|
-
tabs
|
|
154
|
-
.map(({ id }) => id)
|
|
155
|
-
.filter((id): id is number => isNumber(id))
|
|
156
|
-
.forEach((id) =>
|
|
157
|
-
withErrorLog(() => chrome.tabs.update(id, { url }))
|
|
158
|
-
);
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
protected async redirectIfPhishing (url: string): Promise<boolean> {
|
|
163
|
-
const isInDenyList = await checkIfDenied(url);
|
|
164
|
-
|
|
165
|
-
if (isInDenyList) {
|
|
166
|
-
this.redirectPhishingLanding(url);
|
|
167
|
-
|
|
168
|
-
return true;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
return false;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
public async handle<TMessageType extends MessageTypes> (id: string, type: TMessageType, request: RequestTypes[TMessageType], url: string, port: chrome.runtime.Port): Promise<ResponseTypes[keyof ResponseTypes]> {
|
|
175
|
-
if (type === 'pub(phishing.redirectIfDenied)') {
|
|
176
|
-
return this.redirectIfPhishing(url);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
switch (type) {
|
|
180
|
-
case 'pub(authorize.tab)':
|
|
181
|
-
return this.authorize(url, request as RequestAuthorizeTab);
|
|
182
|
-
|
|
183
|
-
case 'pub(accounts.list)':
|
|
184
|
-
return this.accountsList(url, request as RequestAccountList);
|
|
185
|
-
|
|
186
|
-
case 'pub(accounts.subscribe)':
|
|
187
|
-
return this.accountsSubscribe(url, id, port);
|
|
188
|
-
|
|
189
|
-
case 'pub(bytes.sign)':
|
|
190
|
-
return this.bytesSign(url, request as SignerPayloadRaw);
|
|
191
|
-
|
|
192
|
-
case 'pub(extrinsic.sign)':
|
|
193
|
-
return this.extrinsicSign(url, request as SignerPayloadJSON);
|
|
194
|
-
|
|
195
|
-
case 'pub(metadata.list)':
|
|
196
|
-
return this.metadataList(url);
|
|
197
|
-
|
|
198
|
-
case 'pub(metadata.provide)':
|
|
199
|
-
return this.metadataProvide(url, request as MetadataDef);
|
|
200
|
-
|
|
201
|
-
case 'pub(rpc.listProviders)':
|
|
202
|
-
return this.rpcListProviders();
|
|
203
|
-
|
|
204
|
-
case 'pub(rpc.send)':
|
|
205
|
-
return this.rpcSend(request as RequestRpcSend, port);
|
|
206
|
-
|
|
207
|
-
case 'pub(rpc.startProvider)':
|
|
208
|
-
return this.rpcStartProvider(request as string, port);
|
|
209
|
-
|
|
210
|
-
case 'pub(rpc.subscribe)':
|
|
211
|
-
return this.rpcSubscribe(request as RequestRpcSubscribe, id, port);
|
|
212
|
-
|
|
213
|
-
case 'pub(rpc.subscribeConnected)':
|
|
214
|
-
return this.rpcSubscribeConnected(request as null, id, port);
|
|
215
|
-
|
|
216
|
-
case 'pub(rpc.unsubscribe)':
|
|
217
|
-
return this.rpcUnsubscribe(request as RequestRpcUnsubscribe, port);
|
|
218
|
-
|
|
219
|
-
default:
|
|
220
|
-
throw new Error(`Unable to handle message of type ${type}`);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
// Copyright 2019-2022 @subwallet/extension authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
|
-
export function withErrorLog (fn: () => unknown): void {
|
|
5
|
-
try {
|
|
6
|
-
const p = fn();
|
|
7
|
-
|
|
8
|
-
if (p && typeof p === 'object' && typeof (p as Promise<unknown>).catch === 'function') {
|
|
9
|
-
(p as Promise<unknown>).catch(console.error);
|
|
10
|
-
}
|
|
11
|
-
} catch (e) {
|
|
12
|
-
console.error(e);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
// Copyright 2019-2022 @subwallet/extension authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
|
-
import type { MessageTypes, TransportRequestMessage } from '../types';
|
|
5
|
-
|
|
6
|
-
import { assert } from '@polkadot/util';
|
|
7
|
-
|
|
8
|
-
import { PORT_EXTENSION } from '../../defaults';
|
|
9
|
-
import Extension from './Extension';
|
|
10
|
-
import State from './State';
|
|
11
|
-
import Tabs from './Tabs';
|
|
12
|
-
|
|
13
|
-
const state = new State();
|
|
14
|
-
const extension = new Extension(state);
|
|
15
|
-
const tabs = new Tabs(state);
|
|
16
|
-
|
|
17
|
-
export default function handler<TMessageType extends MessageTypes> ({ id, message, request }: TransportRequestMessage<TMessageType>, port: chrome.runtime.Port, extensionPortName = PORT_EXTENSION): void {
|
|
18
|
-
const isExtension = port.name === extensionPortName;
|
|
19
|
-
const sender = port.sender as chrome.runtime.MessageSender;
|
|
20
|
-
const from = isExtension
|
|
21
|
-
? 'extension'
|
|
22
|
-
: (sender.tab && sender.tab.url) || sender.url || '<unknown>';
|
|
23
|
-
const source = `${from}: ${id}: ${message}`;
|
|
24
|
-
|
|
25
|
-
console.log(` [in] ${source}`); // :: ${JSON.stringify(request)}`);
|
|
26
|
-
|
|
27
|
-
const promise = isExtension
|
|
28
|
-
? extension.handle(id, message, request, port)
|
|
29
|
-
: tabs.handle(id, message, request, from, port);
|
|
30
|
-
|
|
31
|
-
promise
|
|
32
|
-
.then((response): void => {
|
|
33
|
-
console.log(`[out] ${source}`); // :: ${JSON.stringify(response)}`);
|
|
34
|
-
|
|
35
|
-
// between the start and the end of the promise, the user may have closed
|
|
36
|
-
// the tab, in which case port will be undefined
|
|
37
|
-
assert(port, 'Port has been disconnected');
|
|
38
|
-
|
|
39
|
-
port.postMessage({ id, response });
|
|
40
|
-
})
|
|
41
|
-
.catch((error: Error): void => {
|
|
42
|
-
console.log(`[err] ${source}:: ${error.message}`);
|
|
43
|
-
|
|
44
|
-
// only send message back to port if it's still connected
|
|
45
|
-
if (port) {
|
|
46
|
-
port.postMessage({ error: error.message, id });
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
// Copyright 2019-2022 @subwallet/extension authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
|
-
import type { MessageTypesWithSubscriptions, SubscriptionMessageTypes } from '../types';
|
|
5
|
-
|
|
6
|
-
type Subscriptions = Record<string, chrome.runtime.Port>;
|
|
7
|
-
|
|
8
|
-
const subscriptions: Subscriptions = {};
|
|
9
|
-
|
|
10
|
-
// return a subscription callback, that will send the data to the caller via the port
|
|
11
|
-
export function createSubscription<TMessageType extends MessageTypesWithSubscriptions> (id: string, port: chrome.runtime.Port): (data: SubscriptionMessageTypes[TMessageType]) => void {
|
|
12
|
-
subscriptions[id] = port;
|
|
13
|
-
|
|
14
|
-
return (subscription: unknown): void => {
|
|
15
|
-
if (subscriptions[id]) {
|
|
16
|
-
port.postMessage({ id, subscription });
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// clear a previous subscriber
|
|
22
|
-
export function unsubscribe (id: string): void {
|
|
23
|
-
if (subscriptions[id]) {
|
|
24
|
-
console.log(`Unsubscribing from ${id}`);
|
|
25
|
-
|
|
26
|
-
delete subscriptions[id];
|
|
27
|
-
} else {
|
|
28
|
-
console.error(`Unable to unsubscribe from ${id}`);
|
|
29
|
-
}
|
|
30
|
-
}
|