This repository has no description
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117import test from 'node:test';import assert from 'node:assert/strict';import { readFile } from 'node:fs/promises';import puppeteer from 'puppeteer-core';
test('bookmark bridge uses the live session before any captured request and follows account changes', async () => { const browser = await puppeteer.launch({ executablePath: process.env.CHROME_PATH || '/usr/bin/google-chrome', headless: true, args: ['--no-sandbox'] }); try { const page = await browser.newPage(); await page.setRequestInterception(true); page.on('request', request => request.respond({ status: 200, contentType: 'text/html', body: '<main><h1>Home</h1></main>' })); await page.goto('https://bsky.app/'); await page.evaluate(() => { window.bookmarkRequests = []; window.networkRequests = []; window.routeThroughFetch = false; window.bookmarkSourceHost = 'api.eurosky.network'; window.BskyPlusAppviewRouting = { bookmarkSource: async () => window.bookmarkSourceHost }; window.setBookmarkSession = did => { const session = { destroyed: false }; const agent = { did, fetchHandler(path, init) { window.bookmarkRequests.push({ did, path, proxy: new Headers(init.headers).get('atproto-proxy') }); if (window.routeThroughFetch) { const payload = btoa(JSON.stringify({ sub: did })); const headers = new Headers(init.headers); headers.set('authorization', `Bearer e30.${payload}.signature`); return window.fetch(new Request(new URL(path, 'https://pds.test'), { headers })); } return Promise.resolve(Response.json({ bookmarks: [] })); } }; window.liveBundle = { session, service: new URL('https://pds.test'), appviewClient: {}, pdsClient: { agent } }; document.querySelector('main')['__reactFiber$sessionTest'] = { memoizedProps: {}, return: { memoizedProps: { value: window.liveBundle }, return: null } }; }; window.setBookmarkSession('did:plc:first'); window.fetch = input => { const request = input instanceof Request ? input : new Request(input); window.networkRequests.push({ url: request.url, proxy: request.headers.get('atproto-proxy') }); return Promise.resolve(Response.json({ bookmarks: [] })); }; }); await page.evaluate(source => { const script = document.createElement('script'); script.dataset.bskyplusChannel = 'session-fallback-channel'; script.textContent = source; document.head.append(script); let next = 0; window.bookmarkBridgeRequest = action => new Promise(resolve => { const requestId = String(++next); const listener = event => { if (event.data?.direction !== 'response' || event.data.requestId !== requestId) return; window.removeEventListener('message', listener); resolve(event.data.state); }; window.addEventListener('message', listener); window.postMessage({ channel: 'session-fallback-channel', direction: 'request', requestId, action }, location.origin); }); }, await readFile('extension/shared/bookmarks-page.js', 'utf8'));
assert.equal((await page.evaluate(() => window.bookmarkBridgeRequest('state'))).available, true); assert.equal((await page.evaluate(() => window.bookmarkBridgeRequest('enable'))).enabled, true); assert.deepEqual(await page.evaluate(() => window.bookmarkRequests), [{ did: 'did:plc:first', path: '/xrpc/app.bsky.bookmark.getBookmarks?limit=100', proxy: 'did:web:api.eurosky.network#bsky_appview' }]); assert.equal((await page.evaluate(() => window.networkRequests.length)), 0);
await page.evaluate(() => { window.routeThroughFetch = true; history.pushState(null, '', '/saved'); }); assert.equal((await page.evaluate(() => Promise.race([ window.bookmarkBridgeRequest('sync'), new Promise((_, reject) => setTimeout(() => reject(new Error('Sync deadlocked')), 1500)) ]))).enabled, true); assert.deepEqual(await page.evaluate(() => window.networkRequests), [{ url: 'https://pds.test/xrpc/app.bsky.bookmark.getBookmarks?limit=100', proxy: 'did:web:api.eurosky.network#bsky_appview' }]);
await page.evaluate(() => { window.setBookmarkSession('did:plc:first'); window.routeThroughFetch = false; }); assert.equal((await page.evaluate(() => window.bookmarkBridgeRequest('sync'))).enabled, true); assert.equal((await page.evaluate(() => window.bookmarkRequests.length)), 3);
await page.evaluate(() => { window.bookmarkSourceHost = 'api.bsky.app'; }); assert.equal((await page.evaluate(() => window.bookmarkBridgeRequest('state'))).available, true); assert.equal((await page.evaluate(() => window.bookmarkBridgeRequest('enable'))).enabled, true); assert.equal((await page.evaluate(() => window.bookmarkRequests.at(-1).proxy)), 'did:web:api.bsky.app#bsky_appview');
await page.evaluate(() => window.setBookmarkSession('did:plc:second')); assert.equal((await page.evaluate(() => window.bookmarkBridgeRequest('state'))).enabled, false); assert.equal((await page.evaluate(() => window.bookmarkBridgeRequest('enable'))).enabled, true); assert.equal((await page.evaluate(() => window.bookmarkRequests.at(-1).did)), 'did:plc:second');
await page.evaluate(() => { window.liveBundle.session.destroyed = true; }); assert.equal((await page.evaluate(() => window.bookmarkBridgeRequest('state'))).available, false); } finally { await browser.close(); }});