Skip to content

Commit

Permalink
Handle log
Browse files Browse the repository at this point in the history
  • Loading branch information
max-lt committed Mar 23, 2024
1 parent 9fa0d2a commit d0fd8ef
Show file tree
Hide file tree
Showing 11 changed files with 69 additions and 15 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "openworkers-runtime"
version = "0.1.3"
version = "0.1.4"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
Expand Down
4 changes: 2 additions & 2 deletions examples/scheduled.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ async fn main() -> Result<(), ()> {
let script = Script {
specifier: module_url(file_path.as_str()),
code: None,
env: None,
env: None
};

let time = std::time::SystemTime::now()
Expand All @@ -51,7 +51,7 @@ async fn main() -> Result<(), ()> {
let local = tokio::task::LocalSet::new();

local.spawn_local(async move {
let mut worker = Worker::new(script).await.unwrap();
let mut worker = Worker::new(script, None).await.unwrap();

match worker
.exec(Task::Scheduled(Some(ScheduledInit::new(res_tx, time))))
Expand Down
4 changes: 2 additions & 2 deletions examples/serve-new.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ async fn handle_request(data: Data<AppState>, req: HttpRequest) -> HttpResponse
let script = Script {
specifier: url.clone(),
code: None,
env: None,
env: None
};

let (res_tx, res_rx) = channel::<http_v02::Response<Bytes>>();
Expand All @@ -52,7 +52,7 @@ async fn handle_request(data: Data<AppState>, req: HttpRequest) -> HttpResponse

let tasks = local.spawn_local(async move {
debug!("create worker");
let mut worker = Worker::new(script).await.unwrap();
let mut worker = Worker::new(script, None).await.unwrap();

debug!("exec fetch task");
match worker.exec(task).await {
Expand Down
4 changes: 2 additions & 2 deletions examples/serve-same.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ async fn main() -> std::io::Result<()> {
let script = Script {
specifier: url.clone(),
code: None,
env: None,
env: None
};

let (task_tx, mut task_rx) = tokio::sync::mpsc::channel(1);
Expand All @@ -119,7 +119,7 @@ async fn main() -> std::io::Result<()> {
let local = tokio::task::LocalSet::new();

let tasks = local.spawn_local(async move {
let mut worker = Worker::new(script).await.unwrap();
let mut worker = Worker::new(script, None).await.unwrap();

loop {
match task_rx.recv().await {
Expand Down
2 changes: 1 addition & 1 deletion src/ext/event_scheduled.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ function triggerScheduledEvent(rid) {
const evt = op_scheduled_init(rid);

// Convert seconds to milliseconds
const scheduledTime = evt.time * 1000;
const scheduledTime = evt.time;

scheduledEventListener({
scheduledTime,
Expand Down
1 change: 1 addition & 0 deletions src/ext/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ mod event_fetch;
mod event_scheduled;

pub use runtime::runtime as runtime_ext;
pub use runtime::LogEvent;

pub use event_fetch::fetch_event as fetch_event_ext;
pub use event_fetch::FetchInit;
Expand Down
5 changes: 4 additions & 1 deletion src/ext/runtime.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// runtime.js
import { op_log } from "ext:core/ops";

// deno_core
import { core, primordials } from "ext:core/mod.js";
Expand Down Expand Up @@ -178,7 +179,9 @@ import * as eventSource from "ext:deno_fetch/27_eventsource.js";

console: nonEnumerable(
// https://choubey.gitbook.io/internals-of-deno/bridge/4.2-print
new console.Console((msg, level) => core.print(msg, level > 1))
new console.Console((msg, level) =>
op_log(level > 1 ? "error" : "log", msg)
)
),

// DOM Exception
Expand Down
43 changes: 41 additions & 2 deletions src/ext/runtime.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,50 @@
use deno_core::Extension;
use deno_core::ExtensionFileSource;
use deno_core::OpState;
use deno_core::serde::Serialize;

deno_core::extension!(
runtime,
deps = [deno_console, deno_web, deno_crypto, deno_fetch, fetch_event, scheduled_event],
deps = [
deno_console,
deno_web,
deno_crypto,
deno_fetch,
fetch_event,
scheduled_event
],
ops = [op_log],
customizer = |ext: &mut Extension| {
ext.esm_files.to_mut().push(ExtensionFileSource::new("ext:runtime.js", include_str!("runtime.js")));
ext.esm_files.to_mut().push(ExtensionFileSource::new(
"ext:runtime.js",
include_str!("runtime.js"),
));
ext.esm_entry_point = Some("ext:runtime.js");
}
);

#[derive(Debug, Serialize)]
pub struct LogEvent {
pub level: String,
pub message: String,
}

#[deno_core::op2(fast)]
fn op_log(state: &mut OpState, #[string] level: &str, #[string] message: &str) {
let evt = LogEvent {
level: level.to_string(),
message: message.to_string(),
};

log::debug!("op_log {:?}", evt);

let tx = state.try_borrow_mut::<std::sync::mpsc::Sender<LogEvent>>();

match tx {
None => log::warn!("failed to borrow log event sender"),
Some(tx) => match tx.send(evt) {
Ok(_) => {},
Err(_) => log::error!("failed to send log event"),
},
}
}
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ pub (crate) use runtime::extensions;

pub use runtime::Script;
pub use runtime::Worker;
pub use ext::LogEvent;
pub use ext::FetchInit;
pub use ext::ScheduledInit;
pub use deno_core::error::AnyError;
Expand Down
16 changes: 13 additions & 3 deletions src/runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ use crate::ext::fetch_event_ext;
use crate::ext::permissions_ext;
use crate::ext::runtime_ext;
use crate::ext::scheduled_event_ext;

use crate::ext::Permissions;
use crate::LogEvent;
use crate::Task;

use std::rc::Rc;
Expand Down Expand Up @@ -78,7 +78,7 @@ pub(crate) fn extensions(for_snapshot: bool) -> Vec<deno_core::Extension> {
pub struct Script {
pub specifier: deno_core::ModuleSpecifier,
pub code: Option<deno_core::ModuleCodeString>,
pub env: Option<String>,
pub env: Option<String>
}

pub struct Worker {
Expand All @@ -88,7 +88,7 @@ pub struct Worker {
}

impl Worker {
pub async fn new(script: Script) -> Result<Self, AnyError> {
pub async fn new(script: Script, log_tx: Option<std::sync::mpsc::Sender<LogEvent>>) -> Result<Self, AnyError> {
let mut js_runtime = match runtime_snapshot() {
None => {
debug!("no runtime snapshot");
Expand Down Expand Up @@ -117,6 +117,16 @@ impl Worker {
let trigger_fetch;
let trigger_scheduled;

// Log event sender
{
match log_tx {
Some(tx) => js_runtime.op_state().borrow_mut().put::<std::sync::mpsc::Sender<LogEvent>>(tx),
None => {
log::warn!("no log event sender provided");
},
};
}

// Bootstrap
{
let script = format!("globalThis.bootstrap('{}', {})", user_agent(), script.env.unwrap_or("undefined".to_string()));
Expand Down

0 comments on commit d0fd8ef

Please sign in to comment.