pub mod abort;
pub mod array_buffer_transfer; pub mod background_sync; pub mod blob; pub mod broadcast_channel; pub mod clipboard; pub mod compression; pub mod crypto;
pub mod custom_event; pub mod dom_exception; pub mod dom_parser; pub mod encoding; pub mod error_event; pub mod events;
pub mod fetch;
pub mod form_data;
pub mod message_channel; pub mod navigator; pub mod notification; pub mod payment_request; pub mod performance; pub mod service_worker; pub mod shared_array_buffer; pub mod sockets; pub mod streams; pub mod structured_clone; pub mod timers; pub mod url;
pub mod url_pattern; pub mod url_search_params;
pub mod wasm;
pub mod websocket;
pub mod worker; pub mod worker_host; use anyhow::Result;
use rusty_v8 as v8;
use abort::setup_abort_api;
use array_buffer_transfer::setup_array_buffer_transfer_api;
use background_sync::setup_background_sync_api;
use blob::setup_blob_api;
use broadcast_channel::setup_broadcast_channel_api;
use clipboard::setup_clipboard_api;
use compression::setup_compression_api;
use crypto::setup_crypto_api;
use custom_event::setup_custom_event_api;
use dom_exception::setup_dom_exception_api;
use dom_parser::setup_dom_parser_api;
use encoding::setup_encoding_api;
use error_event::setup_error_event_api;
use events::setup_events_api;
use fetch::setup_fetch_api;
use form_data::setup_form_data_api;
use message_channel::setup_message_channel_api;
use navigator::setup_navigator_api;
use notification::setup_notification_api;
use payment_request::setup_payment_request_api;
use performance::setup_performance_api;
use service_worker::setup_service_worker_api;
use shared_array_buffer::setup_shared_array_buffer_api;
use sockets::setup_sockets_api;
use structured_clone::setup_structured_clone_api;
use timers::setup_timer_api;
use url::setup_url_api;
use url_pattern::setup_url_pattern_api;
use url_search_params::setup_url_search_params_api;
use websocket::setup_websocket_api;
use worker::setup_worker_api;
#[allow(unused_imports)]
use worker_host::setup_worker_host_api;
pub fn init_web_api(
scope: &mut v8::ContextScope<v8::HandleScope>,
context: &v8::Local<v8::Context>,
) -> Result<()> {
let global = context.global(scope);
setup_crypto_api(scope, context)?;
setup_events_api(scope, context)?;
setup_abort_api(scope, context)?;
setup_blob_api(scope, context)?; setup_timer_api(scope, context)?;
setup_encoding_api(scope, context)?; setup_performance_api(scope, context)?; setup_url_api(scope, context)?;
setup_url_search_params_api(scope, context);
setup_form_data_api(scope, context)?;
setup_fetch_api(scope, context)?;
setup_websocket_api(scope, context)?;
setup_compression_api(scope, context)?;
setup_structured_clone_api(scope, context)?;
setup_array_buffer_transfer_api(scope, context)?;
setup_broadcast_channel_api(scope, context)?;
setup_message_channel_api(scope, context)?;
setup_worker_api(scope, context)?;
setup_shared_array_buffer_api(scope, context)?;
setup_service_worker_api(scope, context)?;
setup_background_sync_api(scope, context)?;
setup_notification_api(scope, context, global)?;
setup_payment_request_api(scope, context, global)?;
setup_error_event_api(scope, context);
setup_custom_event_api(scope, context);
setup_dom_parser_api(scope, context)?;
setup_clipboard_api(scope, context)?;
wasm::setup_wasm_streaming_api(scope, context)?;
setup_dom_exception_api(scope, context)?;
setup_navigator_api(scope, context)?;
setup_url_pattern_api(scope, context)?;
setup_sockets_api(scope, context)?;
let wintertc_helpers_js = r#"
(function() {
// globalThis.self requirement
if (typeof globalThis.self === 'undefined') {
globalThis.self = globalThis;
}
// reportError requirement
if (typeof globalThis.reportError !== 'function') {
globalThis.reportError = function(error) {
if (typeof globalThis.onerror === 'function') {
try {
const msg = (error && error.message) ? error.message : String(error);
globalThis.onerror(msg, '', 0, 0, error);
return;
} catch (_) {}
}
console.error('Unhandled error:', error);
};
}
// PromiseRejectionEvent
if (typeof globalThis.PromiseRejectionEvent === 'undefined') {
const Base = (typeof Event === 'function') ? Event : Object;
globalThis.PromiseRejectionEvent = class PromiseRejectionEvent extends Base {
constructor(type, init = {}) {
try { super(type, init); } catch (_) { super(); }
this.type = type;
this.promise = init.promise;
this.reason = init.reason;
}
};
}
globalThis.__amber_dispatch_unhandled_rejection = function(promise, reason) {
let event;
try {
event = new PromiseRejectionEvent('unhandledrejection', {
promise: promise,
reason: reason,
cancelable: true
});
} catch (_) {
event = { type: 'unhandledrejection', promise: promise, reason: reason };
}
try {
if (typeof globalThis.onunhandledrejection === 'function') {
globalThis.onunhandledrejection(event);
}
} catch (_) {}
try {
if (typeof globalThis.dispatchEvent === 'function') {
globalThis.dispatchEvent(event);
}
} catch (_) {}
};
})();
"#;
if let Some(code) = v8::String::new(scope, wintertc_helpers_js) {
if let Some(script) = v8::Script::compile(scope, code, None) {
let _ = script.run(scope);
}
}
Ok(())
}