wasm/wasm-sharding-js/src/internal_module/core.rs (106 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ use crate::quickjs_sys::*; use crate::EventLoop; use std::string::FromUtf8Error; fn set_timeout(ctx: &mut Context, _this_val: JsValue, argv: &[JsValue]) -> JsValue { let callback = argv.get(0); let timeout = argv.get(1); let rest_args = argv.get(2..).map(|args| args.to_vec()); if let (Some(JsValue::Function(callback)), Some(JsValue::Int(timeout)), Some(event_loop)) = (callback, timeout, ctx.event_loop()) { let n = event_loop.set_timeout( callback.clone(), std::time::Duration::from_millis((*timeout) as u64), rest_args, ); JsValue::Int(n as i32) } else { JsValue::UnDefined } } fn set_immediate(ctx: &mut Context, _this_val: JsValue, argv: &[JsValue]) -> JsValue { let callback = argv.get(0); let args = argv.get(1..).map(|v| v.to_vec()); if let (Some(JsValue::Function(callback)), Some(event_loop)) = (callback, ctx.event_loop()) { let callback = callback.clone(); let n = event_loop.set_timeout(callback, std::time::Duration::from_secs(0), args); JsValue::Int(n as i32) } else { JsValue::UnDefined } } fn next_tick(ctx: &mut Context, _this_val: JsValue, argv: &[JsValue]) -> JsValue { let callback = argv.get(0); let args = argv.get(1..).map(|v| v.to_vec()); if let (Some(JsValue::Function(callback)), Some(event_loop)) = (callback, ctx.event_loop()) { let callback = callback.clone(); event_loop.set_next_tick(Box::new(move |_ctx| { match args { Some(args) => callback.call(&args), None => callback.call(&[]), }; })); } JsValue::UnDefined } fn os_exit(_ctx: &mut Context, _this_val: JsValue, argv: &[JsValue]) -> JsValue { let code = if let Some(JsValue::Int(c)) = argv.get(0) { *c } else { 0 }; std::process::exit(code) } struct ClearTimeout; impl JsFn for ClearTimeout { fn call(ctx: &mut Context, _this_val: JsValue, argv: &[JsValue]) -> JsValue { let timeout_id = argv.get(0); if let (Some(JsValue::Int(timeout_id)), Some(event_loop)) = (timeout_id, ctx.event_loop()) { event_loop.clear_timeout((*timeout_id) as usize); } JsValue::UnDefined } } pub fn init_ext_function(_ctx: &mut Context) {} pub fn init_global_function(ctx: &mut Context) { let mut global = ctx.get_global(); global.set( "clearTimeout", ctx.new_function::<ClearTimeout>("clearTimeout").into(), ); global.set( "setTimeout", ctx.wrap_function("setTimeout", set_timeout).into(), ); global.set( "setImmediate", ctx.wrap_function("setImmediate", set_immediate).into(), ); global.set("nextTick", ctx.wrap_function("nextTick", next_tick).into()); global.set("exit", ctx.wrap_function("exit", os_exit).into()); global.set("env", env_object(ctx).into()); } fn env_object(ctx: &mut Context) -> JsObject { let mut env_obj = ctx.new_object(); let env = std::env::vars(); for (k, v) in env { env_obj.set(&k, ctx.new_string(&v).into()); } env_obj }