diff --git a/packages/extension-base/src/background/handlers/Extension.ts b/packages/extension-base/src/background/handlers/Extension.ts index 5cdd0799..cc74db2a 100644 --- a/packages/extension-base/src/background/handlers/Extension.ts +++ b/packages/extension-base/src/background/handlers/Extension.ts @@ -625,6 +625,9 @@ export default class Extension { case 'pri(json.account.info)': return this.jsonGetAccountInfo(request as KeyringPair$Json); + case 'pri(ping)': + return Promise.resolve(true); + case 'pri(seed.create)': return this.seedCreate(request as RequestSeedCreate); diff --git a/packages/extension-base/src/background/handlers/Tabs.ts b/packages/extension-base/src/background/handlers/Tabs.ts index 49d9edf8..2e2253da 100644 --- a/packages/extension-base/src/background/handlers/Tabs.ts +++ b/packages/extension-base/src/background/handlers/Tabs.ts @@ -244,6 +244,9 @@ export default class Tabs { case 'pub(metadata.provide)': return this.metadataProvide(url, request as MetadataDef); + case 'pub(ping)': + return Promise.resolve(true); + case 'pub(rpc.listProviders)': return this.rpcListProviders(); diff --git a/packages/extension-base/src/background/types.ts b/packages/extension-base/src/background/types.ts index 7ccf20f2..c9b86a43 100644 --- a/packages/extension-base/src/background/types.ts +++ b/packages/extension-base/src/background/types.ts @@ -109,6 +109,7 @@ export interface RequestSignatures { 'pri(metadata.reject)': [RequestMetadataReject, boolean]; 'pri(metadata.requests)': [RequestMetadataSubscribe, boolean, MetadataRequest[]]; 'pri(metadata.list)': [null, MetadataDef[]]; + 'pri(ping)': [null, boolean]; 'pri(seed.create)': [RequestSeedCreate, ResponseSeedCreate]; 'pri(seed.validate)': [RequestSeedValidate, ResponseSeedValidate]; 'pri(settings.notification)': [string, boolean]; @@ -128,6 +129,7 @@ export interface RequestSignatures { 'pub(metadata.list)': [null, InjectedMetadataKnown[]]; 'pub(metadata.provide)': [MetadataDef, boolean]; 'pub(phishing.redirectIfDenied)': [null, boolean]; + 'pub(ping)': [null, boolean]; 'pub(rpc.listProviders)': [void, ResponseRpcListProviders]; 'pub(rpc.send)': [RequestRpcSend, JsonRpcResponse]; 'pub(rpc.startProvider)': [string, ProviderMeta]; diff --git a/packages/extension-base/src/page/Injected.ts b/packages/extension-base/src/page/Injected.ts index 60304038..b0733725 100644 --- a/packages/extension-base/src/page/Injected.ts +++ b/packages/extension-base/src/page/Injected.ts @@ -23,5 +23,11 @@ export default class implements Injected { this.metadata = new Metadata(sendRequest); this.provider = new PostMessageProvider(sendRequest); this.signer = new Signer(sendRequest); + + setInterval((): void => { + sendRequest('pub(ping)', null).catch((): void => { + console.error('Extension unavailable, ping failed'); + }); + }, 5_000 + Math.floor(Math.random() * 5_000)); } } diff --git a/packages/extension-ui/src/messaging.ts b/packages/extension-ui/src/messaging.ts index 878d7ccd..9b4d8fad 100644 --- a/packages/extension-ui/src/messaging.ts +++ b/packages/extension-ui/src/messaging.ts @@ -243,3 +243,7 @@ export async function batchRestore (file: KeyringPairs$Json, password: string): export async function setNotification (notification: string): Promise { return sendMessage('pri(settings.notification)', notification); } + +export async function ping (): Promise { + return sendMessage('pri(ping)', null); +}