79 lines
2.6 KiB
TypeScript
79 lines
2.6 KiB
TypeScript
import browser from 'webextension-polyfill';
|
|
import WakaTimeCore from './core/WakaTimeCore';
|
|
import { PostHeartbeatMessage } from './types/heartbeats';
|
|
|
|
// Add a listener to resolve alarms
|
|
browser.alarms.onAlarm.addListener(async (alarm) => {
|
|
// |alarm| can be undefined because onAlarm also gets called from
|
|
// window.setTimeout on old chrome versions.
|
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
if (alarm && alarm.name == 'heartbeatAlarm') {
|
|
// Checks if the user is online and if there are cached heartbeats requests,
|
|
// if so then procedd to send these payload to wakatime api
|
|
if (navigator.onLine) {
|
|
await WakaTimeCore.sendCachedHeartbeatsRequest();
|
|
}
|
|
}
|
|
});
|
|
|
|
// Create a new alarm for sending cached heartbeats.
|
|
browser.alarms.create('heartbeatAlarm', { periodInMinutes: 2 });
|
|
|
|
/**
|
|
* Whenever a active tab is changed it records a heartbeat with that tab url.
|
|
*/
|
|
browser.tabs.onActivated.addListener(async () => {
|
|
console.log('recording a heartbeat - active tab changed');
|
|
await WakaTimeCore.recordHeartbeat();
|
|
});
|
|
|
|
/**
|
|
* Whenever a active window is changed it records a heartbeat with the active tab url.
|
|
*/
|
|
browser.windows.onFocusChanged.addListener(async (windowId) => {
|
|
if (windowId != browser.windows.WINDOW_ID_NONE) {
|
|
console.log('recording a heartbeat - active window changed');
|
|
await WakaTimeCore.recordHeartbeat();
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Whenever any tab is updated it checks if the updated tab is the tab that is
|
|
* currently active and if it is, then it records a heartbeat.
|
|
*/
|
|
browser.tabs.onUpdated.addListener(async (tabId, changeInfo) => {
|
|
if (changeInfo.status === 'complete') {
|
|
// Get current tab URL.
|
|
const tabs: browser.Tabs.Tab[] = await browser.tabs.query({
|
|
active: true,
|
|
currentWindow: true,
|
|
});
|
|
// If tab updated is the same as active tab
|
|
if (tabId == tabs[0]?.id) {
|
|
await WakaTimeCore.recordHeartbeat();
|
|
}
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Creates IndexedDB
|
|
* https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
|
|
*/
|
|
self.addEventListener('activate', async () => {
|
|
await WakaTimeCore.createDB();
|
|
});
|
|
|
|
browser.runtime.onMessage.addListener(async (request: PostHeartbeatMessage) => {
|
|
if (request.recordHeartbeat === true) {
|
|
await WakaTimeCore.recordHeartbeat(request.projectDetails);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* "Persistent" service worker via bug exploit
|
|
* https://stackoverflow.com/questions/66618136/persistent-service-worker-in-chrome-extension
|
|
*/
|
|
const keepAlive = () => setInterval(chrome.runtime.getPlatformInfo, 20000);
|
|
chrome.runtime.onStartup.addListener(keepAlive);
|
|
keepAlive();
|