Skip to content

Commit e47acbb

Browse files
authored
Merge pull request #6 from phanirithvij/develop
merge phanirithvij/develop
2 parents 36e75be + a1154c2 commit e47acbb

File tree

6 files changed

+75
-39
lines changed

6 files changed

+75
-39
lines changed

docs/internal/DEVLOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,9 +380,12 @@ This document describes the development workflow that went into this project.
380380
- And it runs perfectly fine with no errors on the previous stable chrome version `98.0.4758.102`.
381381
- maybe related https://crbug.com/1296492
382382
- [update channel](https://chromereleases.googleblog.com/2022/03/stable-channel-update-for-desktop.html)
383-
- [ ] Fix this
383+
- [x] Fixed this
384384
- Might require massive restructuring and removing the uses of `chrome.runtime.sendMessage`, maybe use `chrome.tabs.sendMessage`idk.
385+
- Nope, it was trivial
385386
- If using `chrome.tabs.sendMessage` instead of `chrome.runtime.sendMessage` and also manifest v2 thus background page instead of service workers, we won't be affected.
387+
- Solution was to use `sendResponse` everytime and never miss sending a response back, even if it is empty.
388+
- In case of async methods, `sendResponse` need not be used and `return true` still keeps the port open.
386389
387390
- Found another bug with chrome service workers (how surprising)
388391
- `webRequest.onBeforeRequest` won't trigger when service worker is inactive.

src/js/background/background.js

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ importScripts("./api/simkl.js");
7474
importScripts("../common.js");
7575

7676
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
77+
if (!("HandledMessagePorts" in self)) self.HandledMessagePorts = {};
78+
let msgIdx = Object.keys(self.HandledMessagePorts).length;
79+
self.HandledMessagePorts[msgIdx] = {
80+
message,
81+
sender,
82+
};
7783
// consoledebug("[SW] Got message:", message, "from:", sender)();
7884
switch (message.type) {
7985
case CallType.call:
@@ -86,38 +92,36 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
8692
case CallType.oauth.plex.checkTokenValiditiy:
8793
// consoledebug("[SW] Got message for token validation:", message)();
8894
__API__.plex.oauth.checkTokenValiditiy(null, message.token);
89-
return true;
95+
break;
9096
case CallType.oauth.simkl.oauthStart:
9197
__API__.simkl.oauth.oauthStart(sendResponse, message.inPopup);
92-
// https://stackoverflow.com/a/57608759
9398
return true;
9499
case CallType.oauth.simkl.checkTokenValiditiy:
95100
__API__.simkl.oauth.checkTokenValiditiy(null, message.token);
96-
return true;
97-
101+
break;
98102
// bg handlers
99103
case CallType.bg.popupAfterPermissionPrompt:
100104
chrome.tabs.create({
101105
url: chrome.runtime.getURL(
102106
`popup.html?url=${message.plexUrl}#${message.hashRoute}`
103107
),
104108
});
105-
return true;
109+
break;
106110
case CallType.bg.sync.start:
107111
self.aController = new AbortController();
108112
startBgSync(aController.signal);
109-
return true;
113+
break;
110114
case CallType.bg.sync.stop:
111115
!!self.aController && self.aController.abort();
112-
return true;
116+
break;
113117
case CallType.bg.sw.ping:
114118
let r = {
115119
action: ActionType.sw.pong,
116120
type: ActionType.action,
117121
};
118122
chrome.runtime.sendMessage(r);
119123
sendResponse(r);
120-
return true;
124+
return;
121125

122126
// API methods
123127
case CallType.apis.plex.getBgUrl:
@@ -136,7 +140,17 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
136140
consoledebug("Unknown message type", message.type)();
137141
break;
138142
}
139-
return true;
143+
// consoledebug(
144+
// "[SW] Sending null response back",
145+
// message.type,
146+
// message.method,
147+
// message.action
148+
// )();
149+
sendResponse();
150+
self.HandledMessagePorts[msgIdx] = {
151+
...self.HandledMessagePorts[msgIdx],
152+
sendResponse: true,
153+
};
140154
});
141155

142156
// Periodic background sync

src/js/background/sync.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -726,7 +726,7 @@ const startBgSync = async (signal) => {
726726
}
727727
}
728728

729-
await syncDone(serverTime);
729+
syncDone(serverTime);
730730
} else {
731731
if (!simklOauthToken) {
732732
UIEvents.tokenExpired("simkl");
@@ -748,20 +748,20 @@ const startBgSync = async (signal) => {
748748
}
749749
};
750750

751-
const syncDone = async (serverTime) => {
751+
const syncDone = (serverTime) => {
752752
// sync done
753753
consoledebug("Saving server time", serverTime);
754-
await chrome.storage.local.set({
754+
chrome.storage.local.set({
755755
lastSynced: serverTime,
756+
// can set this to true to always do a full sync
757+
// when using the sync now button
758+
doFullSync: false,
756759
});
757-
// comment this line to make `sync now` do fullsyncs everytime
758-
// useful for debugging, don't forget to uncomment this after done
759-
await chrome.storage.local.remove("doFullSync");
760760
let doneMsg = {
761761
type: ActionType.action,
762762
action: ActionType.ui.sync.finished,
763763
};
764-
await chrome.runtime.sendMessage(doneMsg);
764+
chrome.runtime.sendMessage(doneMsg);
765765
};
766766

767767
/*
@@ -813,6 +813,7 @@ const simklAnimeIdstoPlexIds = (media) =>
813813
// unused might required for later
814814

815815
const fetchAniDBTvDBMappings = async (signal) => {
816+
return;
816817
try {
817818
let resp = await fetch(
818819
"https://raw.githubusercontent.com/Anime-Lists/anime-lists/master/anime-list.xml",

src/js/ui/plex.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,11 @@ const finishPlexOauth = (message) => {
6565
consoledebug(message)();
6666
};
6767

68-
const checkPlexAuthTokenValidity = async () => {
68+
const checkPlexAuthTokenValidity = () => {
6969
// Gets plexOauthToken from chrome.storage.sync
7070
// Checks whether it's valid and request user to login again if not
7171
// Note: broadcasting to other connected views is not needed for this
72-
await chrome.runtime.sendMessage({
72+
chrome.runtime.sendMessage({
7373
type: CallType.call,
7474
method: CallType.oauth.plex.checkTokenValiditiy,
7575
});

src/js/ui/popup.js

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,16 @@ const handleHashRoutes = async () => {
7878
startPlexOauth();
7979
} else {
8080
// request service worker to validate and save plex oauth token
81-
await pingServiceWorker();
82-
await checkPlexAuthTokenValidity();
81+
checkPlexAuthTokenValidity();
82+
pingServiceWorker();
8383
}
8484
if (loginType == "simkl") {
8585
startSimklOauth();
8686
} else {
8787
// request service worker to validate and save simkl oauth token
8888
// checkSimklAuthTokenValidity();
89-
await checkSimklAuthTokenValidity();
90-
await pingServiceWorker();
89+
checkSimklAuthTokenValidity();
90+
pingServiceWorker();
9191
}
9292
};
9393

@@ -287,7 +287,7 @@ const onLoad = async () => {
287287
startNextSyncTimer();
288288
}
289289
// service worker healthCheck
290-
await pingServiceWorker();
290+
pingServiceWorker();
291291
})();
292292

293293
uiSetPopupViewState();
@@ -299,8 +299,14 @@ window.addEventListener("resize", uiHandleBackgroundImg);
299299

300300
// Registering UI event handlers (actions)
301301

302-
chrome.runtime.onMessage.addListener(async (message, sender) => {
303-
// consoledebug("Got message:", message, "from:", sender)();
302+
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
303+
if (!("HandledMessagePorts" in window)) window.HandledMessagePorts = {};
304+
let msgIdx = Object.keys(window.HandledMessagePorts).length;
305+
window.HandledMessagePorts[msgIdx] = {
306+
message,
307+
sender,
308+
};
309+
// consoledebug("[popup] got message:", message, "from:", sender)();
304310
switch (message.type) {
305311
case ActionType.action:
306312
switch (message.action) {
@@ -398,7 +404,8 @@ chrome.runtime.onMessage.addListener(async (message, sender) => {
398404
case ActionType.ui.sync.progress:
399405
// handle earch progress item
400406
if (message.value <= 0) {
401-
return;
407+
// don't return here, an sendResponse needs to be called
408+
break;
402409
}
403410
document.body.classList.add("sync-in-progress-plex");
404411
document.body.classList.remove("sync-waiting-for-next-sync");
@@ -416,11 +423,13 @@ chrome.runtime.onMessage.addListener(async (message, sender) => {
416423
window.swPong = message;
417424
break;
418425
case ActionType.sw.tabFocus:
419-
chrome.tabs.update(
420-
(await chrome.tabs.getCurrent()).id,
421-
{ active: true },
422-
(_) => {}
423-
);
426+
(async () => {
427+
chrome.tabs.update(
428+
(await chrome.tabs.getCurrent()).id,
429+
{ active: true },
430+
(_) => {}
431+
);
432+
})();
424433
break;
425434
default:
426435
consoledebug("Unknown action", message)();
@@ -433,8 +442,17 @@ chrome.runtime.onMessage.addListener(async (message, sender) => {
433442
default:
434443
consoledebug("Unknown message type", message)();
435444
}
436-
// required if we don't use sendResponse
437-
return true;
445+
// consoledebug(
446+
// "[popup] Sending null response back",
447+
// message.type,
448+
// message.method,
449+
// message.action
450+
// )();
451+
sendResponse();
452+
window.HandledMessagePorts[msgIdx] = {
453+
...window.HandledMessagePorts[msgIdx],
454+
sendResponse: true,
455+
};
438456
});
439457

440458
// TODOO: move this logic to service worker
@@ -454,7 +472,7 @@ const retrySyncWithBackoff = async (
454472
chrome.storage.local.set({
455473
failedTries: 0,
456474
});
457-
return true;
475+
return;
458476
}
459477
let backOffmult = Math.min(Math.pow(2, failedTries), 30);
460478
restartLibrarySync(
@@ -514,7 +532,7 @@ const startNextSyncTimer = async () => {
514532
}
515533
};
516534

517-
const pingServiceWorker = async () => {
535+
const pingServiceWorker = () => {
518536
consoledebug("ping service worker")();
519537
// ping service worker every 2 minutes
520538
window.pingerHandle && clearInterval(pingerHandle);
@@ -526,7 +544,7 @@ const pingServiceWorker = async () => {
526544
type: CallType.call,
527545
method: CallType.bg.sw.ping,
528546
};
529-
await chrome.runtime.sendMessage(m);
547+
chrome.runtime.sendMessage(m);
530548
window.pingerTimeout && clearTimeout(window.pingerTimeout);
531549
window.pingerTimeout = setTimeout(() => {
532550
if (window.swPong) {

src/js/ui/simkl.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@ const finishSimklOauth = (message) => {
6464
consoledebug(message)();
6565
};
6666

67-
const checkSimklAuthTokenValidity = async () => {
67+
const checkSimklAuthTokenValidity = () => {
6868
// Gets simklOauthToken from chrome.storage.sync
6969
// Checks whether it's valid and request user to login again if not
7070

7171
// Note: broadcasting to other connected views is not needed for this
72-
await chrome.runtime.sendMessage({
72+
chrome.runtime.sendMessage({
7373
type: CallType.call,
7474
method: CallType.oauth.simkl.checkTokenValiditiy,
7575
});

0 commit comments

Comments
 (0)