- 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.
97 lines
2.9 KiB
JavaScript
Executable file
97 lines
2.9 KiB
JavaScript
Executable file
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Brainy CLI Wrapper
|
|
* This script patches the global object to fix TextEncoder issues before loading the CLI
|
|
*/
|
|
|
|
console.log('Brainy running in Node.js environment')
|
|
|
|
// Define a custom PlatformNode class that doesn't rely on this.util.TextEncoder
|
|
if (
|
|
typeof global !== 'undefined' &&
|
|
typeof process !== 'undefined' &&
|
|
process.versions &&
|
|
process.versions.node
|
|
) {
|
|
try {
|
|
// Define a PlatformNode class that uses the global TextEncoder/TextDecoder directly
|
|
class PlatformNode {
|
|
constructor() {
|
|
// Create a util object with necessary methods
|
|
this.util = {
|
|
// Add isFloat32Array and isTypedArray directly to util
|
|
isFloat32Array: (arr) => {
|
|
return !!(
|
|
arr instanceof Float32Array ||
|
|
(arr &&
|
|
Object.prototype.toString.call(arr) === '[object Float32Array]')
|
|
)
|
|
},
|
|
isTypedArray: (arr) => {
|
|
return !!(ArrayBuffer.isView(arr) && !(arr instanceof DataView))
|
|
},
|
|
// Use native TextEncoder and TextDecoder
|
|
TextEncoder: TextEncoder,
|
|
TextDecoder: TextDecoder
|
|
}
|
|
|
|
// Initialize TextEncoder/TextDecoder instances
|
|
this.textEncoder = new TextEncoder()
|
|
this.textDecoder = new TextDecoder()
|
|
}
|
|
|
|
// Define isFloat32Array directly on the instance
|
|
isFloat32Array(arr) {
|
|
return !!(
|
|
arr instanceof Float32Array ||
|
|
(arr &&
|
|
Object.prototype.toString.call(arr) === '[object Float32Array]')
|
|
)
|
|
}
|
|
|
|
// Define isTypedArray directly on the instance
|
|
isTypedArray(arr) {
|
|
return !!(ArrayBuffer.isView(arr) && !(arr instanceof DataView))
|
|
}
|
|
}
|
|
|
|
// Assign the PlatformNode class to the global object
|
|
global.PlatformNode = PlatformNode
|
|
|
|
// Also create an instance and assign it to global.platformNode (lowercase p)
|
|
global.platformNode = new PlatformNode()
|
|
|
|
// Ensure global.util exists and has the necessary methods
|
|
// This is needed because TensorFlow.js might look for these methods in global.util
|
|
if (!global.util) {
|
|
global.util = {}
|
|
}
|
|
|
|
// Add isFloat32Array method if it doesn't exist
|
|
if (!global.util.isFloat32Array) {
|
|
global.util.isFloat32Array = (arr) => {
|
|
return !!(
|
|
arr instanceof Float32Array ||
|
|
(arr &&
|
|
Object.prototype.toString.call(arr) === '[object Float32Array]')
|
|
)
|
|
}
|
|
}
|
|
|
|
// Add isTypedArray method if it doesn't exist
|
|
if (!global.util.isTypedArray) {
|
|
global.util.isTypedArray = (arr) => {
|
|
return !!(ArrayBuffer.isView(arr) && !(arr instanceof DataView))
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.warn('Failed to define global PlatformNode class:', error)
|
|
}
|
|
}
|
|
|
|
// Now load and run the actual CLI
|
|
import('./dist/cli.js').catch((err) => {
|
|
console.error('Error loading CLI:', err)
|
|
process.exit(1)
|
|
})
|