#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 target);
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_