Coverage Report

Created: 2025-08-03 10:06

/src/node/src/node_blob.h
Line
Count
Source (jump to first uncovered line)
1
#ifndef SRC_NODE_BLOB_H_
2
#define SRC_NODE_BLOB_H_
3
4
#include "v8-function-callback.h"
5
#include "v8-template.h"
6
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
7
8
#include "async_wrap.h"
9
#include "base_object.h"
10
#include "dataqueue/queue.h"
11
#include "env.h"
12
#include "memory_tracker.h"
13
#include "node_internals.h"
14
#include "node_snapshotable.h"
15
#include "node_worker.h"
16
#include "v8.h"
17
18
#include <string>
19
#include <unordered_map>
20
#include <vector>
21
22
namespace node {
23
24
class Blob : public BaseObject {
25
 public:
26
  static void RegisterExternalReferences(
27
      ExternalReferenceRegistry* registry);
28
29
  static void CreatePerIsolateProperties(IsolateData* isolate_data,
30
                                         v8::Local<v8::ObjectTemplate> target);
31
  static void CreatePerContextProperties(v8::Local<v8::Object> target,
32
                                         v8::Local<v8::Value> unused,
33
                                         v8::Local<v8::Context> context,
34
                                         void* priv);
35
36
  static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
37
  static void GetReader(const v8::FunctionCallbackInfo<v8::Value>& args);
38
  static void ToSlice(const v8::FunctionCallbackInfo<v8::Value>& args);
39
  static void StoreDataObject(const v8::FunctionCallbackInfo<v8::Value>& args);
40
  static void GetDataObject(const v8::FunctionCallbackInfo<v8::Value>& args);
41
  static void RevokeObjectURL(const v8::FunctionCallbackInfo<v8::Value>& args);
42
43
  static v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
44
      Environment* env);
45
46
  static BaseObjectPtr<Blob> Create(Environment* env,
47
                                    std::shared_ptr<DataQueue> data_queue);
48
49
  static bool HasInstance(Environment* env, v8::Local<v8::Value> object);
50
51
  void MemoryInfo(MemoryTracker* tracker) const override;
52
  SET_MEMORY_INFO_NAME(Blob)
53
  SET_SELF_SIZE(Blob)
54
55
  BaseObjectPtr<Blob> Slice(Environment* env, size_t start, size_t end);
56
57
0
  inline size_t length() const { return this->data_queue_->size().value(); }
58
59
  class BlobTransferData : public worker::TransferData {
60
   public:
61
    explicit BlobTransferData(std::shared_ptr<DataQueue> data_queue)
62
2
        : data_queue(data_queue) {}
63
64
    BaseObjectPtr<BaseObject> Deserialize(
65
        Environment* env,
66
        v8::Local<v8::Context> context,
67
        std::unique_ptr<worker::TransferData> self) override;
68
69
    SET_MEMORY_INFO_NAME(BlobTransferData)
70
    SET_SELF_SIZE(BlobTransferData)
71
    SET_NO_MEMORY_INFO()
72
73
   private:
74
    std::shared_ptr<DataQueue> data_queue;
75
  };
76
77
  class Reader final : public AsyncWrap {
78
   public:
79
    static bool HasInstance(Environment* env, v8::Local<v8::Value> value);
80
    static v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
81
        Environment* env);
82
    static BaseObjectPtr<Reader> Create(Environment* env,
83
                                        BaseObjectPtr<Blob> blob);
84
    static void Pull(const v8::FunctionCallbackInfo<v8::Value>& args);
85
86
    explicit Reader(Environment* env,
87
                    v8::Local<v8::Object> obj,
88
                    BaseObjectPtr<Blob> strong_ptr);
89
90
    SET_NO_MEMORY_INFO()
91
    SET_MEMORY_INFO_NAME(Blob::Reader)
92
    SET_SELF_SIZE(Reader)
93
94
   private:
95
    std::shared_ptr<DataQueue::Reader> inner_;
96
    BaseObjectPtr<Blob> strong_ptr_;
97
    bool eos_ = false;
98
  };
99
100
  BaseObject::TransferMode GetTransferMode() const override;
101
  std::unique_ptr<worker::TransferData> CloneForMessaging() const override;
102
103
  Blob(Environment* env,
104
       v8::Local<v8::Object> obj,
105
       std::shared_ptr<DataQueue> data_queue);
106
107
0
  DataQueue& getDataQueue() const { return *data_queue_; }
108
109
 private:
110
  std::shared_ptr<DataQueue> data_queue_;
111
};
112
113
class BlobBindingData : public SnapshotableObject {
114
 public:
115
  explicit BlobBindingData(Realm* realm, v8::Local<v8::Object> wrap);
116
117
  using InternalFieldInfo = InternalFieldInfoBase;
118
119
  SERIALIZABLE_OBJECT_METHODS()
120
121
  SET_BINDING_ID(blob_binding_data)
122
123
  void MemoryInfo(MemoryTracker* tracker) const override;
124
  SET_SELF_SIZE(BlobBindingData)
125
  SET_MEMORY_INFO_NAME(BlobBindingData)
126
127
  struct StoredDataObject : public MemoryRetainer {
128
    BaseObjectPtr<Blob> blob;
129
    size_t length;
130
    std::string type;
131
132
0
    StoredDataObject() = default;
133
134
    StoredDataObject(
135
        const BaseObjectPtr<Blob>& blob_,
136
        size_t length_,
137
        const std::string& type_);
138
139
    void MemoryInfo(MemoryTracker* tracker) const override;
140
    SET_SELF_SIZE(StoredDataObject)
141
    SET_MEMORY_INFO_NAME(StoredDataObject)
142
  };
143
144
  void store_data_object(
145
      const std::string& uuid,
146
      const StoredDataObject& object);
147
148
  void revoke_data_object(const std::string& uuid);
149
150
  StoredDataObject get_data_object(const std::string& uuid);
151
152
 private:
153
  std::unordered_map<std::string, StoredDataObject> data_objects_;
154
};
155
156
}  // namespace node
157
158
#endif  // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
159
#endif  // SRC_NODE_BLOB_H_