Puente bidireccional entre core y samp-node

Puente bidireccional entre core y samp-node A sequence diagram generated by Archify. Load(ppData) exportacion del plugin InitializeOncePerProcess + NewIsolate CreateEnvironment(bootstrap) e import dinamico de entry_file registerEvent + on(name, trigger) OnPlayerConnect(playerid) events[name]->call, argumentos AMX a V8 llama al trigger y ejecuta la cadena callNative(name, fmt, args) InvokeNativeArray hacia open.mp gira el bucle de eventos hasta resolver la promesa devuelve 0 o 1 a open.mp Arranque del plugin y bootstrap Callback nativo hacia JS Retorno hacia open.mp open.mp · callbacks nativos · Sequence participant open.mp callbacks nativos samp-node · events.cpp · Sequence participant samp-node events.cpp libnode V8 · Tick de nodeimpl · Sequence participant libnode V8 Tick de nodeimpl samp global · functions.cpp · Sequence participant samp global functions.cpp @infernus/core · trigger de bus.ts · Sequence participant @infernus/core trigger de bus.ts Legend request return async trace default message

Que hace el bootstrap

  • • LoadResource gira en while(esmLoading) llamando a Tick y cediendo cada ms hasta cargar el modulo
  • • bootstrap fija ipv4first, importa entry_file y __internal_esmLoaded termina la espera
  • • Despues ProcessTick impulsa Tick cada frame: microtareas, uv_run(NOWAIT), DrainTasks

Como se apoya core en esta capa

  • • El defineEvent de core llama a samp.registerEvent y samp.on al importar
  • • El callback nativo pasa por convertAmxParamsToV8, que convierte celdas AMX en valores V8
  • • beforeEach arma el contexto, asi el sistema de eventos es middleware sobre ese registro

Puente sincrono y limites

  • • Mismo hilo: sin cola entre hilos, Tick ejecuta JS en el hilo principal
  • • Un listener async devuelve una Promise; C++ no puede await, asi que gira el bucle hasta resolverla (resolve toma el booleano, reject es 0)
  • • callNative pasa i/f/s/a/v y recupera I/F/A/V/S; callPublic recorre cada AMX