#pragma once #include "basics.h" #include #include #include namespace workerd::api { class Blob; class MessageEvent final: public Event { public: MessageEvent(jsg::Lock& js, const jsg::JsValue& data, kj::String lastEventId = kj::String(), kj::Maybe> source = kj::none, kj::Maybe urlForOrigin = kj::none); MessageEvent(jsg::Lock& js, jsg::JsRef data, kj::String lastEventId = kj::String(), kj::Maybe> source = kj::none, kj::Maybe urlForOrigin = kj::none); MessageEvent(jsg::Lock& js, kj::String type, const jsg::JsValue& data, kj::String lastEventId = kj::String(), kj::Maybe> source = kj::none, kj::Maybe urlForOrigin = kj::none); MessageEvent(jsg::Lock& js, kj::String type, kj::OneOf, jsg::Ref> data, kj::String lastEventId = kj::String(), kj::Maybe> source = kj::none, kj::Maybe urlForOrigin = kj::none); struct Initializer { jsg::JsRef data; JSG_STRUCT(data); JSG_STRUCT_TS_OVERRIDE(MessageEventInit { data: ArrayBuffer | string; }); }; static jsg::Ref constructor( jsg::Lock& js, kj::String type, Initializer initializer); kj::OneOf> getData(jsg::Lock& js); kj::Maybe> getOrigin(); kj::StringPtr getLastEventId(); // Per the spec, the source of a MessageEvent is one of a MessagePort, // ServiceWorker, WindowProxy, etc. The only one of these we actually // support is MessagePort, return that if its set or null if not. kj::Maybe> getSource(); kj::ArrayPtr> getPorts(); JSG_RESOURCE_TYPE(MessageEvent) { JSG_INHERIT(Event); JSG_READONLY_INSTANCE_PROPERTY(data, getData); JSG_READONLY_INSTANCE_PROPERTY(origin, getOrigin); JSG_READONLY_INSTANCE_PROPERTY(lastEventId, getLastEventId); JSG_READONLY_INSTANCE_PROPERTY(source, getSource); JSG_READONLY_INSTANCE_PROPERTY(ports, getPorts); JSG_TS_ROOT(); JSG_TS_OVERRIDE({ readonly data: any; }); } void visitForMemoryInfo(jsg::MemoryTracker& tracker) const; private: // Blob is used only by web-socket.h/c++ kj::OneOf, jsg::Ref> data; kj::String lastEventId; kj::Maybe> maybeSource; kj::Maybe> maybeOrigin; void visitForGc(jsg::GcVisitor& visitor); }; class OpenEvent final: public Event { public: OpenEvent(): Event("open"_kjc) {} static jsg::Ref constructor() = delete; JSG_RESOURCE_TYPE(OpenEvent) { JSG_INHERIT(Event); } }; class ErrorEvent: public Event { public: struct ErrorEventInit { jsg::Optional message; jsg::Optional filename; jsg::Optional lineno; jsg::Optional colno; jsg::Optional> error; JSG_STRUCT(message, filename, lineno, colno, error); }; ErrorEvent(ErrorEventInit init); ErrorEvent(kj::String type, ErrorEventInit init); ErrorEvent(jsg::Lock& js, jsg::JsValue error); static jsg::Ref constructor( jsg::Lock& js, kj::String type, jsg::Optional init); kj::StringPtr getFilename(); kj::StringPtr getMessage(); int getLineno(); int getColno(); jsg::JsValue getError(jsg::Lock& js); JSG_RESOURCE_TYPE(ErrorEvent) { JSG_INHERIT(Event); JSG_READONLY_PROTOTYPE_PROPERTY(filename, getFilename); JSG_READONLY_PROTOTYPE_PROPERTY(message, getMessage); JSG_READONLY_PROTOTYPE_PROPERTY(lineno, getLineno); JSG_READONLY_PROTOTYPE_PROPERTY(colno, getColno); JSG_READONLY_PROTOTYPE_PROPERTY(error, getError); JSG_TS_ROOT(); } void visitForMemoryInfo(jsg::MemoryTracker& tracker) const; private: ErrorEventInit init; void visitForGc(jsg::GcVisitor& visitor); }; // ====================================================================================== class PromiseRejectionEvent: public Event { public: PromiseRejectionEvent( v8::PromiseRejectEvent type, jsg::V8Ref promise, jsg::Value reason); static jsg::Ref constructor(kj::String type) = delete; jsg::V8Ref getPromise(jsg::Lock& js) { return promise.addRef(js); } jsg::Value getReason(jsg::Lock& js) { return reason.addRef(js); } JSG_RESOURCE_TYPE(PromiseRejectionEvent) { JSG_INHERIT(Event); JSG_READONLY_INSTANCE_PROPERTY(promise, getPromise); JSG_READONLY_INSTANCE_PROPERTY(reason, getReason); } void visitForMemoryInfo(jsg::MemoryTracker& tracker) const { tracker.trackField("promise", promise); tracker.trackField("reason", reason); } private: jsg::V8Ref promise; jsg::Value reason; void visitForGc(jsg::GcVisitor& visitor) { visitor.visit(promise, reason); } }; #define EW_EVENTS_ISOLATE_TYPES \ api::ErrorEvent, api::ErrorEvent::ErrorEventInit, api::MessageEvent, \ api::MessageEvent::Initializer, api::PromiseRejectionEvent, api::OpenEvent } // namespace workerd::api