- Introduced `test-fallback-function.js` and `test-fallback-simple.js` to validate `executeInThread` fallback functionality with both named and anonymous compute-intensive functions. - Added `test-tensorflow-textencoder.js` for TensorFlow.js and TextEncoder tests in a Node.js environment. - Created `test-tensorflow-textencoder.html` for browser-based TensorFlow.js and TextEncoder tests. - Implemented cross-environment test support in `cli-package/src/test-tensorflow-textencoder.ts` for CLI functionality. - Enhanced `src/utils/embedding.ts`, `textEncoding.ts`, and `brainy-wrapper.js` to include updated global `TextEncoder` and `TextDecoder` utilities for compatibility and worker improvements. - Standardized and expanded utility methods in `PlatformNode` for broader support, including `isFloat32Array` and `isTypedArray` checks. - Updated Node.js requirement to `>= 24.4.0` across documentation and configuration files for compatibility improvements. This update introduces comprehensive testing for fallback mechanisms, TensorFlow.js, and TextEncoder across multiple environments, ensuring robustness and compatibility.
142 lines
4.4 KiB
HTML
142 lines
4.4 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 using a simple anonymous function expression
|
|
// This format works with both worker and fallback mechanisms
|
|
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');
|
|
|
|
const globalObj = typeof self !== 'undefined' ? self :
|
|
typeof window !== 'undefined' ? window :
|
|
{};
|
|
|
|
return {
|
|
result,
|
|
duration,
|
|
iterations: data.iterations,
|
|
webWorkersAvailable: typeof globalObj.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>
|