Commit ba521e44 authored by Vũ Hoàng Anh's avatar Vũ Hoàng Anh

feat: add support for syncing tokens from standard Memos instances

parent 7745c72d
Pipeline #3443 failed with stages
......@@ -10,7 +10,7 @@
"name": "api-client"
},
"src/background/service-worker.ts": {
"file": "assets/service-worker.ts-DVsIrub1.js",
"file": "assets/service-worker.ts-DvMHIkFe.js",
"name": "service-worker.ts",
"src": "src/background/service-worker.ts",
"isEntry": true,
......@@ -19,13 +19,13 @@
]
},
"src/content/content-script.ts": {
"file": "assets/content-script.ts-Kz-gf73N.js",
"file": "assets/content-script.ts-BWL85FVS.js",
"name": "content-script.ts",
"src": "src/content/content-script.ts",
"isEntry": true
},
"src/popup/popup.html": {
"file": "assets/popup-bQfbpxZ8.js",
"file": "assets/popup-DmXuB8QF.js",
"name": "popup",
"src": "src/popup/popup.html",
"isEntry": true,
......
......@@ -20,7 +20,7 @@
"content_scripts": [
{
"js": [
"assets/content-script.ts-Kz-gf73N.js"
"assets/content-script.ts-BWL85FVS.js"
],
"matches": [
"<all_urls>"
......@@ -48,7 +48,7 @@
"<all_urls>"
],
"resources": [
"assets/content-script.ts-Kz-gf73N.js"
"assets/content-script.ts-BWL85FVS.js"
],
"use_dynamic_url": false
}
......
import './assets/service-worker.ts-DVsIrub1.js';
import './assets/service-worker.ts-DvMHIkFe.js';
......@@ -17,7 +17,7 @@
overflow-y: auto;
}
</style>
<script type="module" crossorigin src="/assets/popup-bQfbpxZ8.js"></script>
<script type="module" crossorigin src="/assets/popup-DmXuB8QF.js"></script>
<link rel="modulepreload" crossorigin href="/assets/api-client-Y5oDKlCr.js">
<link rel="stylesheet" crossorigin href="/assets/popup-dYtSf2jU.css">
</head>
......
......@@ -33,11 +33,27 @@ async function grabFreshToken(): Promise<string | null> {
world: 'MAIN',
func: async () => {
try {
// 1. Try Memos cookie
const match = document.cookie.match(/(?:^|; )memos\.access-token=([^;]+)/);
if (match && match[1]) return match[1];
// 2. Try localStorage
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
if (key && (key.includes('token') || key.includes('session'))) {
const val = localStorage.getItem(key);
if (val && typeof val === 'string' && val.length > 50 && !val.startsWith('{')) {
return val;
}
}
}
// 3. Try Clerk
const clerk = (window as any).Clerk;
if (clerk?.session?.getToken) {
return await clerk.session.getToken();
}
} catch { /* Clerk not available */ }
} catch { /* ignore */ }
return null;
},
});
......
......@@ -21,6 +21,23 @@ async function tryExtractClerkToken(): Promise<string | null> {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
// 1. Try Memos cookie
const match = document.cookie.match(/(?:^|; )memos\.access-token=([^;]+)/);
if (match && match[1]) return match[1];
// 2. Try Memos API token from localStorage (if any)
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
if (key && (key.includes('token') || key.includes('session'))) {
const val = localStorage.getItem(key);
if (val && typeof val === 'string' && val.length > 50 && !val.startsWith('{')) {
// Return if looks like a JWT or long token
return val;
}
}
}
// 3. Try Clerk token
const clerk = (window as any).Clerk;
// Skip if Clerk loaded but user not signed in
if (clerk && !clerk.user) return null;
......@@ -29,7 +46,7 @@ async function tryExtractClerkToken(): Promise<string | null> {
if (token) return token;
}
} catch {
// Clerk chưa ready, thử lại
// Clerk/Memos chưa ready, thử lại
}
if (attempt < maxRetries - 1) {
......
......@@ -67,11 +67,27 @@ async function grabTokenFromTabs(): Promise<string | null> {
world: 'MAIN',
func: async () => {
try {
// 1. Try Memos cookie
const match = document.cookie.match(/(?:^|; )memos\.access-token=([^;]+)/);
if (match && match[1]) return match[1];
// 2. Try localStorage
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
if (key && (key.includes('token') || key.includes('session'))) {
const val = localStorage.getItem(key);
if (val && typeof val === 'string' && val.length > 50 && !val.startsWith('{')) {
return val;
}
}
}
// 3. Try Clerk
const clerk = (window as any).Clerk;
if (clerk?.session?.getToken) {
return await clerk.session.getToken();
}
} catch { /* Clerk not available */ }
} catch { /* ignore */ }
return null;
},
});
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment