Make it embeddable as standalone
This commit is contained in:
parent
4ccdc569d8
commit
bfad8bf232
16
examples/HelloLoopery.js
Normal file
16
examples/HelloLoopery.js
Normal file
@ -0,0 +1,16 @@
|
||||
/* This is a script not for Node.js but runs completely stand-alone using loopery */
|
||||
print('Welcome to loopery!');
|
||||
|
||||
const port = 3000;
|
||||
|
||||
App().get('/hello', (res, req) => {
|
||||
res.end('world!');
|
||||
}).get('/*', (res, req) => {
|
||||
res.writeHeader('content-type', 'text/html; charset= utf-8').end(req.getHeader('user-agent') + ' är din user agent, biatch!');
|
||||
}).listen(port, (token) => {
|
||||
if (token) {
|
||||
print('Listening to port ' + port);
|
||||
} else {
|
||||
print('Failed to listen to port ' + port);
|
||||
}
|
||||
});
|
31
host.pro
Normal file
31
host.pro
Normal file
@ -0,0 +1,31 @@
|
||||
TEMPLATE = app
|
||||
CONFIG += console c++1z
|
||||
CONFIG -= app_bundle
|
||||
CONFIG -= qt
|
||||
|
||||
SOURCES += \
|
||||
src/host.cpp \
|
||||
src/addon.cpp \
|
||||
uWebSockets/uSockets/src/eventing/epoll.c \
|
||||
uWebSockets/uSockets/src/context.c \
|
||||
uWebSockets/uSockets/src/socket.c \
|
||||
uWebSockets/uSockets/src/eventing/libuv.c \
|
||||
uWebSockets/uSockets/src/ssl.c \
|
||||
uWebSockets/uSockets/src/loop.c
|
||||
|
||||
|
||||
#Separate the Node.js addon from host compilation
|
||||
QMAKE_CXXFLAGS += -DADDON_IS_HOST
|
||||
|
||||
INCLUDEPATH += /home/alexhultman/v8/v8/include
|
||||
INCLUDEPATH += uWebSockets/src
|
||||
INCLUDEPATH += uWebSockets/uSockets/src
|
||||
|
||||
# We can link statically when I figure out how to compile V8 properly
|
||||
LIBS += /home/alexhultman/v8/v8/out/x64.release/libv8_libplatform.so
|
||||
LIBS += /home/alexhultman/v8/v8/out/x64.release/libv8_libbase.so
|
||||
LIBS += /home/alexhultman/v8/v8/out/x64.release/libv8.so
|
||||
LIBS += /home/alexhultman/v8/v8/out/x64.release/libicui18n.so
|
||||
LIBS += /home/alexhultman/v8/v8/out/x64.release/libicuuc.so
|
||||
|
||||
LIBS += -lssl -lcrypto
|
85
src/host.cpp
Normal file
85
src/host.cpp
Normal file
@ -0,0 +1,85 @@
|
||||
/* Welcome to the loopery host sources */
|
||||
#include <libplatform/libplatform.h>
|
||||
#include <v8.h>
|
||||
using namespace v8;
|
||||
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <fstream>
|
||||
|
||||
#include "App.h"
|
||||
|
||||
// We load features from the addon
|
||||
extern void Main(Local<Object> exports);
|
||||
|
||||
// console.log
|
||||
void print(const FunctionCallbackInfo<Value> &args) {
|
||||
String::Utf8Value utf8(args.GetIsolate(), args[0]);
|
||||
std::cout << *utf8 << std::endl;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
if (argc != 2) {
|
||||
std::cout << "Usage: " << argv[0] << " <javascript source file>" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// load script sources
|
||||
std::ifstream t(argv[1]);
|
||||
std::stringstream buffer;
|
||||
buffer << t.rdbuf();
|
||||
std::string code = buffer.str();
|
||||
|
||||
// inte den blekaste
|
||||
V8::InitializeICUDefaultLocation(argv[0]);
|
||||
V8::InitializeExternalStartupData(argv[0]);
|
||||
std::unique_ptr<Platform> platform = platform::NewDefaultPlatform();
|
||||
V8::InitializePlatform(platform.get());
|
||||
V8::Initialize();
|
||||
|
||||
// isolate vet vi typ vad det är
|
||||
Isolate::CreateParams create_params;
|
||||
create_params.array_buffer_allocator = ArrayBuffer::Allocator::NewDefaultAllocator();
|
||||
Isolate *isolate = Isolate::New(create_params);
|
||||
{
|
||||
Isolate::Scope isolate_scope(isolate);
|
||||
HandleScope handle_scope(isolate);
|
||||
|
||||
// register functions (here is where addon.cpp comes in)
|
||||
Local<ObjectTemplate> global = ObjectTemplate::New(isolate);
|
||||
|
||||
// at least register print to global
|
||||
global->Set(String::NewFromUtf8(isolate, "print", NewStringType::kNormal).ToLocalChecked(),
|
||||
FunctionTemplate::New(isolate, print));
|
||||
|
||||
// vi skapar ett context som håller det globala objektet
|
||||
Local<Context> context = Context::New(isolate, nullptr, global);
|
||||
Context::Scope context_scope(context);
|
||||
|
||||
// register µWS features
|
||||
Main(context->Global());
|
||||
|
||||
// ladda in scriptet (preprocessa include)
|
||||
Local<String> source = String::NewFromUtf8(isolate, code.data(), NewStringType::kNormal, (int) code.length()).ToLocalChecked();
|
||||
|
||||
// kompilera hela skiten, med allt inläst
|
||||
Local<Script> script = Script::Compile(context, source).ToLocalChecked();
|
||||
|
||||
// kör första "tick" där vi sätter upp saker
|
||||
Local<Value> result = script->Run(context).ToLocalChecked();
|
||||
|
||||
// kör servern nu
|
||||
uWS::Loop::defaultLoop()->run();
|
||||
}
|
||||
|
||||
|
||||
// fall through
|
||||
std::cout << "Done, bye!" << std::endl;
|
||||
isolate->Dispose();
|
||||
V8::Dispose();
|
||||
V8::ShutdownPlatform();
|
||||
delete create_params.array_buffer_allocator;
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user