#ifndef SRC_NODE_BLOB_H_ #define SRC_NODE_BLOB_H_ #include "v8-function-callback.h" #include "v8-template.h" #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS #include "async_wrap.h" #include "base_object.h" #include "dataqueue/queue.h" #include "env.h" #include "memory_tracker.h" #include "node_internals.h" #include "node_snapshotable.h" #include "node_worker.h" #include "v8.h" #include #include #include namespace node { class Blob : public BaseObject { public: static void RegisterExternalReferences( ExternalReferenceRegistry* registry); static void CreatePerIsolateProperties(IsolateData* isolate_data, v8::Local ctor); static void CreatePerContextProperties(v8::Local target, v8::Local unused, v8::Local context, void* priv); static void New(const v8::FunctionCallbackInfo& args); static void GetReader(const v8::FunctionCallbackInfo& args); static void ToSlice(const v8::FunctionCallbackInfo& args); static void StoreDataObject(const v8::FunctionCallbackInfo& args); static void GetDataObject(const v8::FunctionCallbackInfo& args); static void RevokeObjectURL(const v8::FunctionCallbackInfo& args); static v8::Local GetConstructorTemplate( Environment* env); static BaseObjectPtr Create(Environment* env, std::shared_ptr data_queue); static bool HasInstance(Environment* env, v8::Local object); void MemoryInfo(MemoryTracker* tracker) const override; SET_MEMORY_INFO_NAME(Blob) SET_SELF_SIZE(Blob) BaseObjectPtr Slice(Environment* env, size_t start, size_t end); inline size_t length() const { return this->data_queue_->size().value(); } class BlobTransferData : public worker::TransferData { public: explicit BlobTransferData(std::shared_ptr data_queue) : data_queue(data_queue) {} BaseObjectPtr Deserialize( Environment* env, v8::Local context, std::unique_ptr self) override; SET_MEMORY_INFO_NAME(BlobTransferData) SET_SELF_SIZE(BlobTransferData) SET_NO_MEMORY_INFO() private: std::shared_ptr data_queue; }; class Reader final : public AsyncWrap { public: static bool HasInstance(Environment* env, v8::Local value); static v8::Local GetConstructorTemplate( Environment* env); static BaseObjectPtr Create(Environment* env, BaseObjectPtr blob); static void Pull(const v8::FunctionCallbackInfo& args); explicit Reader(Environment* env, v8::Local obj, BaseObjectPtr strong_ptr); SET_NO_MEMORY_INFO() SET_MEMORY_INFO_NAME(Blob::Reader) SET_SELF_SIZE(Reader) private: std::shared_ptr inner_; BaseObjectPtr strong_ptr_; bool eos_ = false; }; BaseObject::TransferMode GetTransferMode() const override; std::unique_ptr CloneForMessaging() const override; Blob(Environment* env, v8::Local obj, std::shared_ptr data_queue); DataQueue& getDataQueue() const { return *data_queue_; } private: std::shared_ptr data_queue_; }; class BlobBindingData : public SnapshotableObject { public: explicit BlobBindingData(Realm* realm, v8::Local wrap); using InternalFieldInfo = InternalFieldInfoBase; SERIALIZABLE_OBJECT_METHODS() SET_BINDING_ID(blob_binding_data) void MemoryInfo(MemoryTracker* tracker) const override; SET_SELF_SIZE(BlobBindingData) SET_MEMORY_INFO_NAME(BlobBindingData) struct StoredDataObject : public MemoryRetainer { BaseObjectPtr blob; size_t length; std::string type; StoredDataObject() = default; StoredDataObject( const BaseObjectPtr& blob_, size_t length_, const std::string& type_); void MemoryInfo(MemoryTracker* tracker) const override; SET_SELF_SIZE(StoredDataObject) SET_MEMORY_INFO_NAME(StoredDataObject) }; void store_data_object( const std::string& uuid, const StoredDataObject& object); void revoke_data_object(const std::string& uuid); StoredDataObject get_data_object(const std::string& uuid); private: std::unordered_map data_objects_; }; } // namespace node #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS #endif // SRC_NODE_BLOB_H_