Bueno, despues de mucho tiempo persiguiendo el tema, tengo la primera version de XD_JSHARBOUR, que permite ejecutar codigo JS desde harbour, y poderlo integrar en cualquiera de nuestras aplicaciones, por ejemplo en nuestros servidores HBHTTP, con lo que ya no tenemos nada que envidiar a NODEJS, y SI, podremos hacer llamadas a funciones JS creadas por nosotros y viceversa, es decir, desde el codigo JS llamar a funciones Harbour ( estoy con ello )
Codigo Harbour
Resultado:

Evidentemente la idea es no necesitar entorno grafico ( no usar webview por ejemplo )
Codigo Harbour
// ==================================================================
// Codigo Harbour
// ==================================================================
PROCEDURE Main()
LOCAL cJS, cStatus
LOCAL nJobs
// 1. Inicializar
cStatus := XD_JS_INIT()
? "JS_INIT:", cStatus
IF !("ini" $ cStatus)
Alert( "Salir" )
RETURN
ENDIF
XD_JS_SET( "nombre", "Juan" )
? "XD_JS_SET hecho"
? XD_JS_EVAL( 'print("Hola", nombre)' )
? XD_JS_EVAL( 'nombre' )
? XD_JS_GET( "nombre" )
? XD_JS_EVAL( "10 + 20" )
// 3. Usar JS_SET / JS_GET
XD_JS_SET( "x", 42 )
XD_JS_EVAL( 'print("x en JS =", x); y = x * 2;' )
? "y en Harbour =", XD_JS_GET( "y" )
// 2. Evaluar c贸digo JS (multil铆nea con concatenaci贸n)
cJS := 'print("Hola desde QuickJS!");' + hb_eol() + ;
'let x = 42;' + hb_eol() + ;
'print("x =", x);' + hb_eol() + ;
'function prueba() {' + hb_eol() + ;
' print("Ejecutando prueba()");' + hb_eol() + ;
' let res = harbour_call();' + hb_eol() + ;
' print("Respuesta de Harbour:", res);' + hb_eol() + ;
'}'
cStatus := XD_JS_EVAL( cJS )
? "XD_JS_EVAL:", cStatus
// 3. Llamar a la funci贸n JS
cStatus := XD_JS_CALL_FUNCTION("prueba")
? "XD_JS_CALL_FUNCTION:", cStatus
// 4. Probar Worker
cJS := 'if (typeof Worker !== "undefined") {' + hb_eol() + ;
' const w = new Worker(function() {' + hb_eol() + ;
' postMessage("Worker iniciado");' + hb_eol() + ;
' setTimeout(() => {' + hb_eol() + ;
' postMessage("Timeout en worker");' + hb_eol() + ;
' close(); // Cierra el worker' + hb_eol() + ;
' }, 100);' + hb_eol() + ;
' });' + hb_eol() + ;
' w.onmessage = function(e) { print("Worker:", e.data); };' + hb_eol() + ;
' // Opcional: guardar w en global para poder w.terminate() despu茅s' + hb_eol() + ;
' globalThis.activeWorker = w;' + hb_eol() + ;
'} else {' + hb_eol() + ;
' print("Worker no disponible");' + hb_eol() + ;
'}'
cStatus := XD_JS_EVAL( cJS )
? "XD_JS_EVAL (Worker):", cStatus
inkey( 1.0 )
// Terminar workers activos
XD_JS_EVAL( 'if (globalThis.activeWorker) { globalThis.activeWorker.terminate(); print("Worker terminado"); }' )
// 5. Procesar eventos pendientes
inkey( 1.0 )
DO WHILE (nJobs := XD_JS_EXECUTE_PENDING()) > 0
inkey(1.0)
ENDDO
// 6. Liberar
? XD_JS_FREE()
inkey( 0 )
WAIT
RETURN
Evidentemente la idea es no necesitar entorno grafico ( no usar webview por ejemplo )
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noci贸n del tiempo
El secreto de la felicidad no est谩 en hacer lo que te gusta, sino en que te guste lo que haces
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noci贸n del tiempo
El secreto de la felicidad no est谩 en hacer lo que te gusta, sino en que te guste lo que haces