Skip to main content
Glama
test-localstorage.jsโ€ข7.08 kB
#!/usr/bin/env node /** * Test localStorage access in Composer */ import { chromium } from 'playwright'; import { readFileSync } from 'fs'; import { resolve, dirname } from 'path'; import { fileURLToPath } from 'url'; const currentDir = dirname(fileURLToPath(import.meta.url)); const tokenPath = resolve(currentDir, 'correct-jwt-new.txt'); const jwtToken = readFileSync(tokenPath, 'utf8').trim(); async function testLocalStorage() { console.log('๐Ÿ—„๏ธ Testing localStorage Access in Composer\n'); const baseURL = "https://composer.euconquisto.com/#/embed"; const orgId = "36c92686-c494-ec11-a22a-dc984041c95d"; const embedURL = `${baseURL}/auth-with-token/pt_br/home/${orgId}/${jwtToken}`; let browser; try { console.log('๐Ÿš€ Launching browser...'); browser = await chromium.launch({ headless: false, args: ['--disable-web-security', '--disable-features=VizDisplayCompositor'] }); const context = await browser.newContext({ viewport: { width: 1280, height: 720 } }); const page = await context.newPage(); console.log('๐Ÿ“ก Navigating to Composer...'); await page.goto(embedURL, { waitUntil: 'networkidle', timeout: 60000 }); console.log('โœ… Page loaded\n'); // Wait for content to load await page.waitForTimeout(5000); // Get all localStorage data console.log('๐Ÿ“ฆ Reading localStorage contents:'); const localStorageData = await page.evaluate(() => { const data = {}; for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i); try { const value = localStorage.getItem(key); // Try to parse JSON values try { data[key] = JSON.parse(value); } catch { data[key] = value; } } catch (e) { data[key] = `<Error reading: ${e.message}>`; } } return data; }); // Display localStorage contents const keys = Object.keys(localStorageData); console.log(`\n๐Ÿ”‘ Found ${keys.length} localStorage keys:\n`); keys.forEach(key => { const value = localStorageData[key]; console.log(`๐Ÿ“Œ Key: "${key}"`); if (typeof value === 'object') { console.log(` Value (JSON):`); console.log(` ${JSON.stringify(value, null, 2).split('\n').join('\n ')}`); } else if (typeof value === 'string' && value.length > 100) { console.log(` Value (truncated): ${value.substring(0, 100)}...`); console.log(` Length: ${value.length} characters`); } else { console.log(` Value: ${value}`); } console.log(''); }); // Check sessionStorage too console.log('\n๐Ÿ“ฆ Reading sessionStorage contents:'); const sessionStorageData = await page.evaluate(() => { const data = {}; for (let i = 0; i < sessionStorage.length; i++) { const key = sessionStorage.key(i); try { const value = sessionStorage.getItem(key); try { data[key] = JSON.parse(value); } catch { data[key] = value; } } catch (e) { data[key] = `<Error reading: ${e.message}>`; } } return data; }); const sessionKeys = Object.keys(sessionStorageData); console.log(`\n๐Ÿ”‘ Found ${sessionKeys.length} sessionStorage keys:\n`); sessionKeys.forEach(key => { const value = sessionStorageData[key]; console.log(`๐Ÿ“Œ Key: "${key}"`); if (typeof value === 'object') { console.log(` Value (JSON):`); console.log(` ${JSON.stringify(value, null, 2).split('\n').join('\n ')}`); } else if (typeof value === 'string' && value.length > 100) { console.log(` Value (truncated): ${value.substring(0, 100)}...`); console.log(` Length: ${value.length} characters`); } else { console.log(` Value: ${value}`); } console.log(''); }); // Look for composition-related keys console.log('\n๐Ÿ” Analyzing for composition-related storage:'); const compositionKeys = [...keys, ...sessionKeys].filter(key => key.toLowerCase().includes('compos') || key.toLowerCase().includes('content') || key.toLowerCase().includes('widget') || key.toLowerCase().includes('rdp') ); if (compositionKeys.length > 0) { console.log(`Found ${compositionKeys.length} potentially composition-related keys:`); compositionKeys.forEach(key => console.log(` - ${key}`)); } else { console.log('No obvious composition-related keys found in storage'); } // Test setting and getting localStorage console.log('\n๐Ÿงช Testing localStorage write access:'); const testResult = await page.evaluate(() => { try { const testKey = 'mcp-test-key'; const testValue = { test: true, timestamp: new Date().toISOString() }; localStorage.setItem(testKey, JSON.stringify(testValue)); const retrieved = localStorage.getItem(testKey); localStorage.removeItem(testKey); return { success: true, retrieved }; } catch (e) { return { success: false, error: e.message }; } }); if (testResult.success) { console.log('โœ… localStorage write/read access confirmed'); } else { console.log('โŒ localStorage access error:', testResult.error); } console.log('\n๐Ÿ’ก Summary:'); console.log(' - Can read localStorage: โœ…'); console.log(' - Can write localStorage: ' + (testResult.success ? 'โœ…' : 'โŒ')); console.log(' - Total localStorage keys: ' + keys.length); console.log(' - Total sessionStorage keys: ' + sessionKeys.length); // Keep browser open for 10 seconds to review console.log('\nโณ Browser will close in 10 seconds...'); await page.waitForTimeout(10000); } catch (error) { console.error('โŒ Error:', error.message); } finally { if (browser) { await browser.close(); } } } testLocalStorage().catch(console.error);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rkm097git/euconquisto-composer-mcp-poc'

If you have feedback or need assistance with the MCP directory API, please join our Discord server