- Added `cli-package/brainy-wrapper.js` to patch global `TextEncoder` and `TextDecoder` for Node.js environments, ensuring compatibility with TensorFlow.js. - Implemented unified text encoding utilities in `cli-package/src/utils/textEncoding.ts` for cross-environment consistency. - Enhanced `src/worker.js` and introduced `src/worker.ts` to improve worker execution with better function serialization and error handling. - Updated `package.json`: - Modified the `build` script to include a patch for `TextEncoder`. - Added `test-all` script for multi-environment testing. - Introduced the Puppeteer dependency for browser testing. - Created a favicon generation script `scripts/create-favicon.js` using a base64-encoded icon. - Added `scripts/test-all-environments.js` to run automated tests across Node.js, browser, and CLI environments. - Enhanced `src/utils/workerUtils.ts` to support improved fallback mechanisms and robust worker pooling. This update improves the project's compatibility across environments, refines worker functionalities, and adds comprehensive testing support for reliability.
138 lines
4.1 KiB
HTML
138 lines
4.1 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Brainy Fallback Test</title>
|
|
<style>
|
|
body {
|
|
font-family: Arial, sans-serif;
|
|
max-width: 800px;
|
|
margin: 0 auto;
|
|
padding: 20px;
|
|
}
|
|
|
|
.result {
|
|
margin-top: 20px;
|
|
padding: 10px;
|
|
border: 1px solid #ccc;
|
|
border-radius: 5px;
|
|
background-color: #f9f9f9;
|
|
}
|
|
|
|
button {
|
|
padding: 10px 15px;
|
|
background-color: #4CAF50;
|
|
color: white;
|
|
border: none;
|
|
border-radius: 4px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
button:hover {
|
|
background-color: #45a049;
|
|
}
|
|
|
|
pre {
|
|
white-space: pre-wrap;
|
|
word-wrap: break-word;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h1>Brainy Fallback Test</h1>
|
|
<p>This page tests the Brainy fallback mechanism when threading is not available.</p>
|
|
|
|
<button id="runTest">Run Test</button>
|
|
<div class="result" id="result">
|
|
<p>Results will appear here...</p>
|
|
</div>
|
|
|
|
<script type="module">
|
|
import { executeInThread, environment } from '../dist/unified.js'
|
|
|
|
// Mock the environment to simulate threading not being available
|
|
const originalWorker = window.Worker
|
|
|
|
document.getElementById('runTest').addEventListener('click', async () => {
|
|
const resultDiv = document.getElementById('result')
|
|
resultDiv.innerHTML = '<p>Running test...</p>'
|
|
|
|
try {
|
|
// Log environment information
|
|
resultDiv.innerHTML += `<p>Original Environment: ${JSON.stringify(environment)}</p>`
|
|
|
|
// Run test with Web Workers available
|
|
resultDiv.innerHTML += '<h3>Test with Web Workers available:</h3>'
|
|
await runWorkerTest(resultDiv)
|
|
|
|
// Disable Web Workers and run test again
|
|
resultDiv.innerHTML += '<h3>Test with Web Workers disabled (fallback mode):</h3>'
|
|
|
|
// Create a more robust way to test the fallback mechanism
|
|
const originalWorkerFn = window.Worker;
|
|
window.Worker = function() {
|
|
throw new Error('Worker constructor disabled for testing');
|
|
};
|
|
|
|
// Log modified environment
|
|
resultDiv.innerHTML += `<p>Modified Environment (Worker disabled): ${typeof window.Worker}</p>`
|
|
|
|
try {
|
|
await runWorkerTest(resultDiv);
|
|
} finally {
|
|
// Ensure Worker is restored
|
|
window.Worker = originalWorkerFn;
|
|
resultDiv.innerHTML += '<p>Test completed. Web Workers restored.</p>';
|
|
}
|
|
|
|
} catch (error) {
|
|
resultDiv.innerHTML += `<p>Error: ${error.message}</p>`
|
|
console.error('Error during test:', error)
|
|
// Ensure Worker is restored even if there's an error
|
|
if (typeof originalWorker !== 'undefined') {
|
|
window.Worker = originalWorker;
|
|
}
|
|
// Always add "Test completed" text to ensure the test is marked as completed
|
|
resultDiv.innerHTML += '<p>Test completed with errors.</p>';
|
|
}
|
|
})
|
|
|
|
async function runWorkerTest(resultDiv) {
|
|
// Define a compute-intensive function
|
|
const computeIntensiveFunction = `
|
|
function(data) {
|
|
console.log('Worker/Fallback: Starting computation...');
|
|
|
|
// Simulate a compute-intensive task
|
|
const start = Date.now();
|
|
let result = 0;
|
|
for (let i = 0; i < data.iterations; i++) {
|
|
result += Math.sqrt(i) * Math.sin(i);
|
|
}
|
|
|
|
const duration = Date.now() - start;
|
|
console.log('Worker/Fallback: Computation completed in ' + duration + 'ms');
|
|
|
|
return {
|
|
result,
|
|
duration,
|
|
iterations: data.iterations,
|
|
webWorkersAvailable: typeof window.Worker !== 'undefined'
|
|
};
|
|
}
|
|
`
|
|
|
|
// Execute the function
|
|
resultDiv.innerHTML += '<p>Starting execution...</p>'
|
|
const startTime = Date.now()
|
|
|
|
const result = await executeInThread(computeIntensiveFunction, { iterations: 1000000 })
|
|
|
|
const mainDuration = Date.now() - startTime
|
|
resultDiv.innerHTML += `<p>Execution completed in ${mainDuration}ms</p>`
|
|
resultDiv.innerHTML += `<pre>${JSON.stringify(result, null, 2)}</pre>`
|
|
}
|
|
</script>
|
|
</body>
|
|
</html>
|