Skip to content

Commit 97666de

Browse files
committed
improve automatic migration
1 parent 41ed75b commit 97666de

2 files changed

Lines changed: 76 additions & 34 deletions

File tree

src/Landing/MigrationInfo.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ const attemptAutoMigration = () => {
4343
migrator.requestMigrationDataViaIframe(oldOrigin, () => {
4444
snackbar.addMessage("Success");
4545
loading.value = false;
46+
neverShowAgain();
4647
}, () => {
4748
snackbar.addMessage("Failed. Please migrate manually.");
4849
loading.value = false;

src/misc/util/migration.ts

Lines changed: 75 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,58 +12,99 @@ export const useMigrator = () => {
1212
oldDomainUrl: string,
1313
onSuccess: () => void,
1414
onError: () => void,
15-
maxRetries = 15,
15+
maxRetries = 5,
1616
retryIntervalMs = 1000,
1717
): void {
1818
const expectedOrigin = new URL(oldDomainUrl).origin;
1919

20-
const iframe = document.createElement("iframe");
21-
iframe.src = oldDomainUrl;
22-
iframe.style.display = "none";
23-
document.body.appendChild(iframe);
24-
25-
const messageHandler = (event: MessageEvent<MigrationMessage>) => {
26-
if (event.origin !== expectedOrigin) return;
27-
if (event.data?.type !== "migrationDataResponse") return;
20+
const openMigrationWindow = () => {
21+
let success = false;
22+
window.addEventListener("message", (event: MessageEvent<MigrationMessage>) => {
23+
console.log(event)
24+
if (event.origin !== expectedOrigin) return;
25+
if (event.data?.type !== "migrationDataResponse") return;
26+
window.removeEventListener("message", openMigrationWindow);
27+
persistanceService.setState(event.data.migrationData);
28+
success = true;
29+
onSuccess();
30+
w?.close();
31+
});
32+
const w = window.open(oldDomainUrl, "_blank");
33+
console.log(w, oldDomainUrl)
34+
setTimeout(() => {
35+
if (!success) {
36+
window.removeEventListener("message", openMigrationWindow);
37+
fallbackToIframe();
38+
w?.close();
39+
}
40+
}, 10000);
41+
}
2842

29-
window.removeEventListener("message", messageHandler);
30-
if (document.body.contains(iframe)) {
31-
document.body.removeChild(iframe);
32-
}
43+
openMigrationWindow();
3344

34-
persistanceService.setState(event.data.migrationData);
35-
onSuccess();
36-
};
45+
const fallbackToIframe = () => {
46+
const iframe = document.createElement("iframe");
47+
iframe.src = oldDomainUrl;
48+
iframe.style.display = "none";
49+
document.body.appendChild(iframe);
3750

38-
window.addEventListener("message", messageHandler);
51+
const messageHandler = (event: MessageEvent<MigrationMessage>) => {
52+
if (event.origin !== expectedOrigin) return;
53+
if (event.data?.type !== "migrationDataResponse") return;
3954

40-
let attempts = 0;
41-
const sendRequest = () => {
42-
if (attempts >= maxRetries) {
43-
onError();
4455
window.removeEventListener("message", messageHandler);
4556
if (document.body.contains(iframe)) {
4657
document.body.removeChild(iframe);
4758
}
48-
return;
49-
}
5059

51-
if (iframe.contentWindow) {
52-
iframe.contentWindow.postMessage({ type: "requestMigrationData" }, expectedOrigin);
53-
attempts++;
54-
setTimeout(sendRequest, retryIntervalMs);
55-
} else {
56-
setTimeout(sendRequest, retryIntervalMs);
57-
}
58-
};
60+
persistanceService.setState(event.data.migrationData);
61+
onSuccess();
62+
};
63+
64+
window.addEventListener("message", messageHandler);
5965

60-
iframe.onload = () => {
61-
sendRequest();
62-
};
66+
let attempts = 0;
67+
const sendRequest = () => {
68+
if (attempts >= maxRetries) {
69+
window.removeEventListener("message", messageHandler);
70+
if (document.body.contains(iframe)) {
71+
document.body.removeChild(iframe);
72+
}
73+
onError();
74+
return;
75+
}
76+
77+
if (iframe.contentWindow) {
78+
iframe.contentWindow.postMessage({ type: "requestMigrationData" }, expectedOrigin);
79+
attempts++;
80+
setTimeout(sendRequest, retryIntervalMs);
81+
} else {
82+
setTimeout(sendRequest, retryIntervalMs);
83+
}
84+
};
85+
86+
iframe.onload = () => {
87+
sendRequest();
88+
};
89+
}
6390
}
6491

6592
function setupMigrationDataListener(allowedOrigin: string): void {
6693
console.log("Setting up migration data listener", allowedOrigin);
94+
setInterval(() => {
95+
const state = persistanceService.getState();
96+
if (state.history.entries.length > 0) {
97+
console.log("sending state to opener");
98+
const response: MigrationMessage = {
99+
type: "migrationDataResponse",
100+
migrationData: state
101+
};
102+
103+
window.opener?.postMessage(response, {
104+
targetOrigin: allowedOrigin
105+
});
106+
}
107+
}, 1000);
67108
window.addEventListener("message", (event: MessageEvent<MigrationMessage>) => {
68109
console.log("received message", event.data);
69110
if (event.origin !== allowedOrigin) return;

0 commit comments

Comments
 (0)