prepare / Espresso

☕ Bridge your C# soul to the power of Javascript (V8 Javascript Engine / NodeJs)
MIT License
60 stars 11 forks source link

Espresso, NodeJS 13.5.0 #59

Open prepare opened 4 years ago

prepare commented 4 years ago

Bridge your C# soul to the power of Javascript (V8 Javascript Engine / NodeJs)

espr_nd_13_5_0

EspressoND, Http/2, NodeJS13.5.0

prepare commented 4 years ago

Patches for NodeJS 13.5.0

There are 5 patches, patches are located here => Espresso\node_patches\node13.5.0_modified

...about line 6


#if defined(LEAK_SANITIZER)
#include <sanitizer/lsan_interface.h>
#endif

#if HAVE_INSPECTOR
#include "inspector/worker_inspector.h"  // ParentInspectorHandle
#endif
//////////////////////////////////
//#espresso ,#1
#include "../src/libespresso/bridge2.h"
void DoEngineSetupCallback(JsEngine* engine, JsContext* jsContext);
void DoEngineClosingCallback(JsEngine* engine,
                             JsContext* jsContext,
                             int exitCode);
//////////////////////////////////
namespace node {

using v8::Context;
using v8::HandleScope;
using v8::Isolate;
using v8::Local;

_patch 1: src/node_maininstance.cc


...about line 113

int NodeMainInstance::Run() {
  Locker locker(isolate_);
  Isolate::Scope isolate_scope(isolate_);
  HandleScope handle_scope(isolate_);

  int exit_code = 0;
  std::unique_ptr<Environment> env = CreateMainEnvironment(&exit_code);

  CHECK_NOT_NULL(env);
  Context::Scope context_scope(env->context());

  if (exit_code == 0) {

    ////////////////////////////////
    //#espresso ,#2
    JsEngine* jsEngine = JsEngine::NewFromExistingIsolate(isolate_);
    v8::Persistent<Context>* pcontext =
        new v8::Persistent<Context>(isolate_, env->context());
    JsContext* jscontext =
        JsContext::NewFromExistingContext(0, jsEngine, pcontext);
    DoEngineSetupCallback(jsEngine, jscontext);
    ////////////////////////////////    

    {   
      InternalCallbackScope callback_scope(
          env.get(),
          Local<Object>(),
          { 1, 0 },
          InternalCallbackScope::kAllowEmptyResource |
              InternalCallbackScope::kSkipAsyncHooks);
      LoadEnvironment(env.get());
    }

_patch 2: src/node_maininstance.cc


...about line 170

      // Emit `beforeExit` if the loop became alive either after emitting
        // event, or after running some callbacks.
        more = uv_loop_alive(env->event_loop());
      } while (more == true && !env->is_stopping());
      env->performance_state()->Mark(
          node::performance::NODE_PERFORMANCE_MILESTONE_LOOP_EXIT);
    }

    env->set_trace_sync_io(false);
    exit_code = EmitExit(env.get());

    ////////////////////////////////
    //#espresso ,#3
    DoEngineClosingCallback(jsEngine, jscontext, exit_code);
    ////////////////////////////////
  }

  env->set_can_call_into_js(false);
  env->stop_sub_worker_contexts();
  ResetStdio();
  env->RunCleanup();

_patch 3: src/node_maininstance.cc


prepare commented 4 years ago

... about line about line 911

Module._resolveFilename = function(request, parent, isMain, options) {
  if (NativeModule.canBeRequiredByUsers(request)) {
    return request;
  }

  ////////////////////////////////////////////
  //#espresso, #4
  if (request.endsWith(".espr")) {
      return request;
  }
  ////////////////////////////////////////////
  let paths;

patch4: lib/internal/modules/cjs/loader.js


... about line about line 1188

 // Native extension for .node
Module._extensions['.node'] = function(module, filename) {
  if (manifest) {
    const content = fs.readFileSync(filename);
    const moduleURL = pathToFileURL(filename);
    manifest.assertIntegrity(moduleURL, content);
  }
  // Be aware this doesn't use `content`
  return process.dlopen(module, path.toNamespacedPath(filename));
};

//////////////////////////////////
//#espresso, #5 
Module._extensions['.espr'] = function (module, filename) {
    //this make node to callback to our module
    var content = LibEspresso.LoadMainSrcFile();
    module._compile(stripBOM(content), filename);
};
//////////////////////////////////

patch5: lib/internal/modules/cjs/loader.js