grpc-libp2p-client 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,248 @@
1
+ import { pipe } from 'it-pipe';
2
+ import { pushable } from 'it-pushable';
3
+
4
+ const MaxChunkSize = 4 * 1024 - 5;
5
+ class StreamWriter {
6
+ constructor(sink, options = {}) {
7
+ this.sink = sink;
8
+ this.options = options;
9
+ //private p = pushable({ objectMode: false })
10
+ this.bytesWritten = 0;
11
+ this.abortController = new AbortController();
12
+ // 背压控制相关属性
13
+ this.backpressureHistory = [];
14
+ this.isBackpressure = false;
15
+ this.writeQueue = [];
16
+ this.isProcessingQueue = false;
17
+ // 事件系统
18
+ this.listeners = new Map();
19
+ if (options) {
20
+ this.options = {
21
+ chunkSize: options.chunkSize ?? MaxChunkSize,
22
+ bufferSize: options.bufferSize ?? 5 * 1024 * 1024,
23
+ retries: options.retries ?? 3
24
+ };
25
+ }
26
+ else {
27
+ this.options = {
28
+ chunkSize: MaxChunkSize,
29
+ bufferSize: 5 * 1024 * 1024,
30
+ retries: 3
31
+ };
32
+ }
33
+ if (this.options.chunkSize && this.options.chunkSize > MaxChunkSize) {
34
+ this.options.chunkSize = MaxChunkSize;
35
+ }
36
+ const basePushable = pushable({ objectMode: false });
37
+ // 保留原始方法引用
38
+ basePushable._originalPush = basePushable.push.bind(basePushable);
39
+ basePushable._originalNext = basePushable.next.bind(basePushable);
40
+ basePushable._queueSize = 0;
41
+ // 重写 next 方法
42
+ Object.defineProperty(basePushable, 'next', {
43
+ value: async () => {
44
+ const result = await basePushable._originalNext();
45
+ if (!result.done && result.value) {
46
+ basePushable._queueSize -= result.value.byteLength;
47
+ }
48
+ return result;
49
+ },
50
+ writable: false,
51
+ configurable: false
52
+ });
53
+ // 安全重写 push 方法
54
+ Object.defineProperty(basePushable, 'push', {
55
+ value: (chunk) => {
56
+ basePushable._queueSize += chunk.byteLength;
57
+ return basePushable._originalPush(chunk);
58
+ },
59
+ writable: false,
60
+ configurable: false
61
+ });
62
+ this.p = basePushable;
63
+ this.startPipeline();
64
+ }
65
+ get queueSize() {
66
+ return this.p._queueSize;
67
+ }
68
+ // 在 next() 操作时更新队列大小
69
+ async safeNext() {
70
+ const result = await this.p.next();
71
+ if (!result.done) {
72
+ this.p._queueSize -= result.value.byteLength;
73
+ }
74
+ return result;
75
+ }
76
+ handleError(err) {
77
+ this.dispatchEvent(new CustomEvent('error', { detail: err }));
78
+ this.abort(err.message);
79
+ }
80
+ startPipeline() {
81
+ pipe(this.p, this.createTransform(), this.sink).catch((err) => this.handleError(err)); // 正确绑定this
82
+ }
83
+ createTransform() {
84
+ return async function* (source) {
85
+ for await (const chunk of source) {
86
+ yield chunk;
87
+ }
88
+ };
89
+ }
90
+ async write(data) {
91
+ if (this.abortController.signal.aborted)
92
+ return;
93
+ return new Promise((resolve, reject) => {
94
+ const task = async () => {
95
+ try {
96
+ const buffer = await this.convertToBuffer(data);
97
+ await this.writeChunks(buffer);
98
+ resolve();
99
+ }
100
+ catch (err) {
101
+ reject(err);
102
+ }
103
+ };
104
+ this.writeQueue.push(task);
105
+ this.processQueue();
106
+ });
107
+ }
108
+ async convertToBuffer(data) {
109
+ if (data instanceof Blob)
110
+ return data.arrayBuffer();
111
+ if (typeof data === 'string')
112
+ return new TextEncoder().encode(data).buffer;
113
+ return data;
114
+ }
115
+ async writeChunks(buffer) {
116
+ for (let offset = 0; offset < buffer.byteLength; offset += this.options.chunkSize) {
117
+ const end = Math.min(offset + this.options.chunkSize, buffer.byteLength);
118
+ const chunk = new Uint8Array(end - offset);
119
+ chunk.set(new Uint8Array(buffer.slice(offset, end)));
120
+ await this.retryableWrite(chunk);
121
+ this.updateProgress(chunk.byteLength);
122
+ }
123
+ }
124
+ async retryableWrite(chunk, attempt = 0) {
125
+ try {
126
+ await this.monitorBackpressure();
127
+ await new Promise((resolve, reject) => {
128
+ try {
129
+ this.p.push(chunk);
130
+ }
131
+ catch (err) {
132
+ reject(err);
133
+ }
134
+ resolve();
135
+ });
136
+ }
137
+ catch (err) {
138
+ if (attempt < this.options.retries) {
139
+ const delay = this.calculateRetryDelay(attempt);
140
+ await new Promise(r => setTimeout(r, delay));
141
+ return this.retryableWrite(chunk, attempt + 1);
142
+ }
143
+ throw err;
144
+ }
145
+ }
146
+ async monitorBackpressure() {
147
+ const checkInterval = 50;
148
+ const historySize = 10;
149
+ while (true) {
150
+ const currentSize = this.queueSize; // 空值合并运算符
151
+ if (currentSize > 0) {
152
+ this.backpressureHistory.push(currentSize);
153
+ }
154
+ if (this.backpressureHistory.length > historySize) {
155
+ this.backpressureHistory.shift();
156
+ }
157
+ const avg = this.backpressureHistory.reduce((a, b) => a + b, 0) / historySize;
158
+ const dynamicThreshold = Math.min(this.options.bufferSize * 0.8, avg * 1.5);
159
+ if (currentSize < dynamicThreshold || currentSize === 0) {
160
+ if (this.isBackpressure) {
161
+ this.isBackpressure = false;
162
+ this.dispatchEvent(new CustomEvent('backpressure', {
163
+ detail: {
164
+ currentSize,
165
+ averageSize: avg,
166
+ threshold: dynamicThreshold,
167
+ waitingTime: 0
168
+ }
169
+ }));
170
+ }
171
+ return;
172
+ }
173
+ if (!this.isBackpressure) {
174
+ this.isBackpressure = true;
175
+ this.dispatchEvent(new CustomEvent('backpressure', {
176
+ detail: {
177
+ currentSize,
178
+ averageSize: avg,
179
+ threshold: dynamicThreshold,
180
+ waitingTime: 0
181
+ }
182
+ }));
183
+ }
184
+ const waitTime = Math.min(10, checkInterval * Math.pow(2, currentSize / dynamicThreshold));
185
+ await new Promise(r => setTimeout(r, waitTime));
186
+ if (this.abortController.signal.aborted)
187
+ break;
188
+ }
189
+ }
190
+ calculateRetryDelay(attempt) {
191
+ const baseDelay = 10;
192
+ const maxDelay = 100;
193
+ return Math.min(baseDelay * Math.pow(2, attempt) + Math.random() * 100, maxDelay);
194
+ }
195
+ async processQueue() {
196
+ if (this.isProcessingQueue || this.abortController.signal.aborted)
197
+ return;
198
+ this.isProcessingQueue = true;
199
+ while (this.writeQueue.length > 0) {
200
+ if (this.abortController.signal.aborted)
201
+ break;
202
+ await this.monitorBackpressure();
203
+ const task = this.writeQueue.shift();
204
+ await task();
205
+ }
206
+ this.isProcessingQueue = false;
207
+ }
208
+ updateProgress(bytes) {
209
+ this.bytesWritten += bytes;
210
+ this.dispatchEvent(new CustomEvent('progress', {
211
+ detail: { loaded: this.bytesWritten }
212
+ }));
213
+ }
214
+ async end() {
215
+ this.p.end();
216
+ await this.sink.return?.();
217
+ this.cleanup();
218
+ }
219
+ abort(reason = 'User aborted') {
220
+ this.abortController.abort(reason);
221
+ this.cleanup();
222
+ this.dispatchEvent(new CustomEvent('abort', { detail: reason }));
223
+ }
224
+ cleanup() {
225
+ this.p.end();
226
+ this.abortController.abort();
227
+ this.writeQueue = [];
228
+ }
229
+ addEventListener(type, callback) {
230
+ const handlers = this.listeners.get(type) || [];
231
+ handlers.push(callback);
232
+ this.listeners.set(type, handlers);
233
+ }
234
+ // 修复后的代码片段
235
+ dispatchEvent(event) {
236
+ const handlers = this.listeners.get(event.type) || [];
237
+ handlers.forEach(handler => handler(event));
238
+ }
239
+ // 明确指定事件类型
240
+ dispatchBackpressureEvent(detail) {
241
+ this.dispatchEvent(new CustomEvent('backpressure', {
242
+ detail
243
+ }));
244
+ }
245
+ }
246
+
247
+ export { StreamWriter };
248
+ //# sourceMappingURL=stream.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.esm.js","sources":["../../src/dc-http2/stream.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}