use crate::{
Context, JsResult, JsString, JsValue,
builtins::promise::OperationType,
context::intrinsics::Intrinsics,
job::JobCallback,
object::{JsFunction, JsObject},
realm::Realm,
};
use time::{OffsetDateTime, UtcOffset};
pub trait HostHooks {
fn make_job_callback(&self, callback: JsFunction, _context: &mut Context) -> JobCallback {
JobCallback::new(callback, ())
}
#[cfg_attr(feature = "native-backtrace", track_caller)]
fn call_job_callback(
&self,
job: JobCallback,
this: &JsValue,
args: &[JsValue],
context: &mut Context,
) -> JsResult<JsValue> {
job.callback().call(this, args, context)
}
fn promise_rejection_tracker(
&self,
_promise: &JsObject,
_operation: OperationType,
_context: &mut Context,
) {
}
fn ensure_can_compile_strings(
&self,
_realm: Realm,
_parameters: &[JsString],
_body: &JsString,
_direct: bool,
_context: &mut Context,
) -> JsResult<()> {
Ok(())
}
fn has_source_text_available(&self, _function: &JsFunction, _context: &mut Context) -> bool {
true
}
fn ensure_can_add_private_element(
&self,
_o: &JsObject,
_context: &mut Context,
) -> JsResult<()> {
Ok(())
}
fn create_global_object(&self, intrinsics: &Intrinsics) -> JsObject {
JsObject::with_object_proto(intrinsics)
}
fn create_global_this(&self, _intrinsics: &Intrinsics) -> Option<JsObject> {
None
}
#[deprecated(
since = "0.21.0",
note = "Use `context.clock().now().millis_since_epoch()` instead"
)]
fn utc_now(&self) -> i64 {
let now = OffsetDateTime::now_utc();
now.unix_timestamp() * 1000 + i64::from(now.millisecond())
}
fn local_timezone_offset_seconds(&self, unix_time_seconds: i64) -> i32 {
OffsetDateTime::from_unix_timestamp(unix_time_seconds)
.ok()
.and_then(|t| UtcOffset::local_offset_at(t).ok())
.map_or(0, UtcOffset::whole_seconds)
}
fn max_buffer_size(&self, _context: &mut Context) -> u64 {
1_610_612_736 }
}
#[derive(Debug, Clone, Copy)]
pub struct DefaultHooks;
impl HostHooks for DefaultHooks {}