workboots
Version:
a lightweight message proxy for webworkers and worker threads
228 lines (184 loc) • 5.95 kB
JavaScript
/**
* Browserify Example for work-boots
* Demonstrates full cross-platform compatibility
*/
// Browserify will bundle this for browser use
const { WorkBoots } = require('../dist/work-boots.browser.js');
// Example 1: Basic Usage
async function basicExample() {
console.log('=== Basic Browserify Example ===');
const workBoots = new WorkBoots({
socksFile: './worker-universal.js'
});
workBoots.onMessage(({ data }) => {
console.log('Main thread received:', data);
});
await workBoots.ready();
workBoots.postMessage({ message: 'Hello from Browserify!' });
}
// Example 2: Error Handling
async function errorHandlingExample() {
console.log('\n=== Error Handling Example ===');
const workBoots = new WorkBoots({
socksFile: './nonexistent-worker.js'
});
try {
await workBoots.ready();
workBoots.postMessage({ test: 'data' });
console.log('Fallback to local execution worked');
} catch (error) {
console.log('Error handled gracefully:', error.message);
}
}
// Example 3: Performance Testing
async function performanceExample() {
console.log('\n=== Performance Example ===');
const workBoots = new WorkBoots({
socksFile: './worker-universal.js'
});
const startTime = Date.now();
const messageCount = 100;
let receivedCount = 0;
workBoots.onMessage(({ data }) => {
receivedCount++;
if (receivedCount === messageCount) {
const endTime = Date.now();
console.log(`Processed ${messageCount} messages in ${endTime - startTime}ms`);
}
});
await workBoots.ready();
for (let i = 0; i < messageCount; i++) {
workBoots.postMessage({ id: i, data: `Message ${i}` });
}
}
// Example 4: Large Data Transfer
async function largeDataExample() {
console.log('\n=== Large Data Example ===');
const workBoots = new WorkBoots({
socksFile: './worker-universal.js'
});
workBoots.onMessage(({ data }) => {
console.log('Received large data:', {
processed: data.processed,
dataSize: JSON.stringify(data.original).length,
timestamp: data.timestamp
});
});
await workBoots.ready();
const largeData = {
array: new Array(10000).fill(0).map((_, i) => i),
object: Object.fromEntries(
new Array(1000).fill(0).map((_, i) => [`key${i}`, `value${i}`])
),
timestamp: Date.now()
};
workBoots.postMessage(largeData);
}
// Example 5: Custom Worker Factory
async function customWorkerExample() {
console.log('\n=== Custom Worker Factory Example ===');
const customFactory = (socksFile) => {
// Custom worker creation logic
console.log('Creating custom worker for:', socksFile);
return new Worker(socksFile);
};
const workBoots = new WorkBoots({
socksFile: './worker-universal.js',
instantiateWorker: customFactory
});
workBoots.onMessage(({ data }) => {
console.log('Custom worker received:', data);
});
await workBoots.ready();
workBoots.postMessage({ custom: 'worker test' });
}
// Example 6: Multiple Workers
async function multipleWorkersExample() {
console.log('\n=== Multiple Workers Example ===');
const workers = [];
const workerCount = 3;
for (let i = 0; i < workerCount; i++) {
const workBoots = new WorkBoots({
socksFile: './worker-universal.js'
});
workBoots.onMessage(({ data }) => {
console.log(`Worker ${i} received:`, data);
});
await workBoots.ready();
workers.push(workBoots);
}
// Send messages to all workers
workers.forEach((worker, index) => {
worker.postMessage({ workerId: index, message: `Hello worker ${index}!` });
});
// Clean up
setTimeout(() => {
workers.forEach(worker => worker.terminate());
console.log('All workers terminated');
}, 1000);
}
// Example 7: Environment Detection
function environmentDetectionExample() {
console.log('\n=== Environment Detection Example ===');
const workBoots = new WorkBoots({
socksFile: './worker-universal.js'
});
console.log('Environment detection:');
console.log('- isNode:', typeof process !== 'undefined' && process.versions && process.versions.node);
console.log('- isBrowser:', typeof window !== 'undefined' && typeof document !== 'undefined');
console.log('- Worker support:', workBoots.detectWorkerSupport());
console.log('- Worker factory type:', typeof workBoots.createDefaultWorkerFactory());
}
// Example 8: Message Queuing
async function messageQueuingExample() {
console.log('\n=== Message Queuing Example ===');
const workBoots = new WorkBoots({
socksFile: './worker-universal.js'
});
// Send messages before ready
workBoots.postMessage({ queued: 1 });
workBoots.postMessage({ queued: 2 });
workBoots.postMessage({ queued: 3 });
workBoots.onMessage(({ data }) => {
console.log('Received queued message:', data);
});
// Messages will be processed after ready
await workBoots.ready();
workBoots.postMessage({ afterReady: 'test' });
}
// Run all examples
async function runAllExamples() {
try {
await basicExample();
await errorHandlingExample();
await performanceExample();
await largeDataExample();
await customWorkerExample();
await multipleWorkersExample();
environmentDetectionExample();
await messageQueuingExample();
console.log('\n=== All Examples Completed Successfully ===');
} catch (error) {
console.error('Example failed:', error);
}
}
// Export for use in other modules
module.exports = {
basicExample,
errorHandlingExample,
performanceExample,
largeDataExample,
customWorkerExample,
multipleWorkersExample,
environmentDetectionExample,
messageQueuingExample,
runAllExamples
};
// Run examples if this file is executed directly
if (typeof window !== 'undefined') {
// Browser environment
window.runWorkBootsExamples = runAllExamples;
} else if (require.main === module) {
// Node.js environment
runAllExamples();
}