@libp2p/perf 2.0.1-6625a27fc → 2.0.1-68db79f6b
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.
- package/README.md +1 -1
- package/dist/index.min.js +1 -1
- package/dist/src/perf-service.d.ts.map +1 -1
- package/dist/src/perf-service.js +9 -62
- package/dist/src/perf-service.js.map +1 -1
- package/package.json +10 -6
- package/src/perf-service.ts +12 -60
package/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
[](http://libp2p.io/)
|
2
2
|
[](https://discuss.libp2p.io)
|
3
3
|
[](https://codecov.io/gh/libp2p/js-libp2p)
|
4
|
-
[](https://github.com/libp2p/js-libp2p/actions/workflows/main.yml?query=branch%3Amain)
|
5
5
|
|
6
6
|
> Implementation of Perf Protocol
|
7
7
|
|
package/dist/index.min.js
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
(function (root, factory) {(typeof module === 'object' && module.exports) ? module.exports = factory() : root.Libp2PPerf = factory()}(typeof self !== 'undefined' ? self : this, function () {
|
2
|
-
"use strict";var Libp2PPerf=(()=>{var O=Object.defineProperty;var
|
2
|
+
"use strict";var Libp2PPerf=(()=>{var O=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var k=(s,t)=>{for(var e in t)O(s,e,{get:t[e],enumerable:!0})},M=(s,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of v(t))!I.call(s,n)&&n!==e&&O(s,n,{get:()=>t[n],enumerable:!(o=A(t,n))||o.enumerable});return s};var R=s=>M(O({},"__esModule",{value:!0}),s);var j={};k(j,{perf:()=>X});function S(){let s={};return s.promise=new Promise((t,e)=>{s.resolve=t,s.reject=e}),s}var g=class{buffer;mask;top;btm;next;constructor(t){if(!(t>0)||t-1&t)throw new Error("Max size for a FixedFIFO should be a power of two");this.buffer=new Array(t),this.mask=t-1,this.top=0,this.btm=0,this.next=null}push(t){return this.buffer[this.top]!==void 0?!1:(this.buffer[this.top]=t,this.top=this.top+1&this.mask,!0)}shift(){let t=this.buffer[this.btm];if(t!==void 0)return this.buffer[this.btm]=void 0,this.btm=this.btm+1&this.mask,t}isEmpty(){return this.buffer[this.btm]===void 0}},b=class{size;hwm;head;tail;constructor(t={}){this.hwm=t.splitLimit??16,this.head=new g(this.hwm),this.tail=this.head,this.size=0}calculateSize(t){return t?.byteLength!=null?t.byteLength:1}push(t){if(t?.value!=null&&(this.size+=this.calculateSize(t.value)),!this.head.push(t)){let e=this.head;this.head=e.next=new g(2*this.head.buffer.length),this.head.push(t)}}shift(){let t=this.tail.shift();if(t===void 0&&this.tail.next!=null){let e=this.tail.next;this.tail.next=null,this.tail=e,t=this.tail.shift()}return t?.value!=null&&(this.size-=this.calculateSize(t.value)),t}isEmpty(){return this.head.isEmpty()}};var N=class extends Error{type;code;constructor(t,e){super(t??"The operation was aborted"),this.type="aborted",this.code=e??"ABORT_ERR"}};function B(s={}){return z(e=>{let o=e.shift();if(o==null)return{done:!0};if(o.error!=null)throw o.error;return{done:o.done===!0,value:o.value}},s)}function z(s,t){t=t??{};let e=t.onEnd,o=new b,n,c,u,y=S(),l=async()=>{try{return o.isEmpty()?u?{done:!0}:await new Promise((r,h)=>{c=w=>{c=null,o.push(w);try{r(s(o))}catch(i){h(i)}return n}}):s(o)}finally{o.isEmpty()&&queueMicrotask(()=>{y.resolve(),y=S()})}},d=r=>c!=null?c(r):(o.push(r),n),p=r=>(o=new b,c!=null?c({error:r}):(o.push({error:r}),n)),m=r=>{if(u)return n;if(t?.objectMode!==!0&&r?.byteLength==null)throw new Error("objectMode was not true but tried to push non-Uint8Array value");return d({done:!1,value:r})},f=r=>u?n:(u=!0,r!=null?p(r):d({done:!0})),E=()=>(o=new b,f(),{done:!0}),T=r=>(f(r),{done:!0});if(n={[Symbol.asyncIterator](){return this},next:l,return:E,throw:T,push:m,end:f,get readableLength(){return o.size},onEmpty:async r=>{let h=r?.signal;if(h?.throwIfAborted(),o.isEmpty())return;let w,i;h!=null&&(w=new Promise((K,D)=>{i=()=>{D(new N)},h.addEventListener("abort",i)}));try{await Promise.race([y.promise,w])}finally{i!=null&&h!=null&&h?.removeEventListener("abort",i)}}},e==null)return n;let a=n;return n={[Symbol.asyncIterator](){return this},next(){return a.next()},throw(r){return a.throw(r),e!=null&&(e(r),e=void 0),{done:!0}},return(){return a.return(),e!=null&&(e(),e=void 0),{done:!0}},push:m,end(r){return a.end(r),e!=null&&(e(r),e=void 0),n},get readableLength(){return a.readableLength},onEmpty:r=>a.onEmpty(r)},n}var _="/perf/1.0.0";var x=class{log;protocol;components;started;databuf;writeBlockSize;maxInboundStreams;maxOutboundStreams;runOnTransientConnection;constructor(t,e={}){this.components=t,this.log=t.logger.forComponent("libp2p:perf"),this.started=!1,this.protocol=e.protocolName??_,this.writeBlockSize=e.writeBlockSize??65536,this.databuf=new ArrayBuffer(this.writeBlockSize),this.maxInboundStreams=e.maxInboundStreams??1,this.maxOutboundStreams=e.maxOutboundStreams??1,this.runOnTransientConnection=e.runOnTransientConnection??!1}async start(){await this.components.registrar.handle(this.protocol,t=>{this.handleMessage(t).catch(e=>{this.log.error("error handling perf protocol message",e)})},{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:this.runOnTransientConnection}),this.started=!0}async stop(){await this.components.registrar.unhandle(this.protocol),this.started=!1}isStarted(){return this.started}async handleMessage(t){let{stream:e}=t;try{let o=this.writeBlockSize,n;for await(let u of e.source)n==null&&(n=Number(u.getBigUint64(0,!1)));if(n==null)throw new Error("bytesToSendBack was not set");let c=new Uint8Array(this.databuf,0,this.databuf.byteLength);await e.sink(async function*(){for(;n>0;){let u=o;u>n&&(u=n),n=n-u,yield c.subarray(0,u)}}())}catch(o){e.abort(o)}}async*measurePerformance(t,e,o,n={}){this.log("opening stream on protocol %s to %a",this.protocol,t);let c=new Uint8Array(this.databuf),u=this.writeBlockSize,y=Date.now(),l=Date.now(),d=await this.components.connectionManager.openConnection(t,{...n,force:n.reuseExistingConnection!==!0});this.log("opened connection after %d ms",Date.now()-l),l=Date.now();let p=await d.newStream(this.protocol,n);this.log("opened stream after %d ms",Date.now()-l),l=Date.now();let m=0,f=0,E=Date.now();new DataView(this.databuf).setBigUint64(0,BigInt(o),!1),this.log("sending %i bytes to %p",e,d.remotePeer);try{let a=B({objectMode:!0});p.sink(async function*(){for(yield c.subarray(0,8);e>0;){let i=u;i>e&&(i=e),yield c.subarray(0,i),e-=i,Date.now()-l>1e3&&(a.push({type:"intermediary",timeSeconds:(Date.now()-l)/1e3,uploadBytes:m,downloadBytes:0}),l=Date.now(),m=0),m+=i,f+=i}a.end()}()).catch(i=>{a.end(i)}),yield*a,this.log("upload complete after %d ms",Date.now()-E);let r=0;l=Date.now();let h=0,w=Date.now();for await(let i of p.source)Date.now()-l>1e3&&(yield{type:"intermediary",timeSeconds:(Date.now()-l)/1e3,uploadBytes:0,downloadBytes:r},l=Date.now(),r=0),r+=i.byteLength,h+=i.byteLength;if(this.log("download complete after %d ms",Date.now()-w),h!==o)throw new Error(`Expected to receive ${o} bytes, but received ${h}`);yield{type:"final",timeSeconds:(Date.now()-y)/1e3,uploadBytes:f,downloadBytes:h},this.log("performed %s to %p",this.protocol,d.remotePeer),await p.close()}catch(a){throw this.log("error sending %d/%d bytes to %p: %s",f,e,d.remotePeer,a),p.abort(a),a}}};function X(s={}){return t=>new x(t,s)}return R(j);})();
|
3
3
|
return Libp2PPerf}));
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"perf-service.d.ts","sourceRoot":"","sources":["../../src/perf-service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1G,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,qBAAa,IAAK,YAAW,SAAS,EAAE,aAAa;IACnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,SAAgB,QAAQ,EAAE,MAAM,CAAA;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;gBAErC,UAAU,EAAE,cAAc,EAAE,IAAI,GAAE,QAAa;IAYtD,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAavB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAK5B,SAAS,IAAK,OAAO;IAIf,aAAa,CAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCrD,kBAAkB,CAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,cAAc,CAAC,UAAU,CAAC;
|
1
|
+
{"version":3,"file":"perf-service.d.ts","sourceRoot":"","sources":["../../src/perf-service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1G,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,qBAAa,IAAK,YAAW,SAAS,EAAE,aAAa;IACnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,SAAgB,QAAQ,EAAE,MAAM,CAAA;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;gBAErC,UAAU,EAAE,cAAc,EAAE,IAAI,GAAE,QAAa;IAYtD,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAavB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAK5B,SAAS,IAAK,OAAO;IAIf,aAAa,CAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCrD,kBAAkB,CAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,cAAc,CAAC,UAAU,CAAC;CA6H3I"}
|
package/dist/src/perf-service.js
CHANGED
@@ -76,14 +76,19 @@ export class Perf {
|
|
76
76
|
const uint8Buf = new Uint8Array(this.databuf);
|
77
77
|
const writeBlockSize = this.writeBlockSize;
|
78
78
|
const initialStartTime = Date.now();
|
79
|
+
let lastReportedTime = Date.now();
|
79
80
|
const connection = await this.components.connectionManager.openConnection(ma, {
|
80
81
|
...options,
|
81
82
|
force: options.reuseExistingConnection !== true
|
82
83
|
});
|
84
|
+
this.log('opened connection after %d ms', Date.now() - lastReportedTime);
|
85
|
+
lastReportedTime = Date.now();
|
83
86
|
const stream = await connection.newStream(this.protocol, options);
|
87
|
+
this.log('opened stream after %d ms', Date.now() - lastReportedTime);
|
88
|
+
lastReportedTime = Date.now();
|
84
89
|
let lastAmountOfBytesSent = 0;
|
85
|
-
let lastReportedTime = Date.now();
|
86
90
|
let totalBytesSent = 0;
|
91
|
+
const uploadStart = Date.now();
|
87
92
|
// tell the remote how many bytes we will send. Up cast to 64 bit number
|
88
93
|
// as if we send as ui32 we limit total transfer size to 4GB
|
89
94
|
const view = new DataView(this.databuf);
|
@@ -123,71 +128,12 @@ export class Perf {
|
|
123
128
|
output.end(err);
|
124
129
|
});
|
125
130
|
yield* output;
|
126
|
-
|
127
|
-
const b = byteStream(stream)
|
128
|
-
await b.write(uint8Buf.subarray(0, 8), options)
|
129
|
-
|
130
|
-
while (sendBytes > 0) {
|
131
|
-
let toSend: number = writeBlockSize
|
132
|
-
|
133
|
-
if (toSend > sendBytes) {
|
134
|
-
toSend = sendBytes
|
135
|
-
}
|
136
|
-
|
137
|
-
const chunk = uint8Buf.subarray(0, toSend)
|
138
|
-
|
139
|
-
await b.write(chunk, options)
|
140
|
-
|
141
|
-
sendBytes -= toSend
|
142
|
-
|
143
|
-
if (Date.now() - lastReportedTime > 1000) {
|
144
|
-
yield {
|
145
|
-
type: 'intermediary',
|
146
|
-
timeSeconds: (Date.now() - lastReportedTime) / 1000,
|
147
|
-
uploadBytes: lastAmountOfBytesSent,
|
148
|
-
downloadBytes: 0
|
149
|
-
}
|
150
|
-
|
151
|
-
// record last reported time after `console.log` because it can
|
152
|
-
// affect benchmark timings
|
153
|
-
lastReportedTime = Date.now()
|
154
|
-
lastAmountOfBytesSent = 0
|
155
|
-
}
|
156
|
-
|
157
|
-
lastAmountOfBytesSent += toSend
|
158
|
-
totalBytesSent += toSend
|
159
|
-
}
|
160
|
-
|
161
|
-
// sent all the bytes, close the write end of the stream
|
162
|
-
await b.unwrap().closeWrite()
|
163
|
-
|
164
|
-
*/
|
131
|
+
this.log('upload complete after %d ms', Date.now() - uploadStart);
|
165
132
|
// Read the received bytes
|
166
133
|
let lastAmountOfBytesReceived = 0;
|
167
134
|
lastReportedTime = Date.now();
|
168
135
|
let totalBytesReceived = 0;
|
169
|
-
|
170
|
-
while (totalBytesReceived < receiveBytes) {
|
171
|
-
const buf = await b.read(1024, options)
|
172
|
-
|
173
|
-
if (Date.now() - lastReportedTime > 1000) {
|
174
|
-
yield {
|
175
|
-
type: 'intermediary',
|
176
|
-
timeSeconds: (Date.now() - lastReportedTime) / 1000,
|
177
|
-
uploadBytes: 0,
|
178
|
-
downloadBytes: lastAmountOfBytesReceived
|
179
|
-
}
|
180
|
-
|
181
|
-
// record last reported time after `console.log` because it can
|
182
|
-
// affect benchmark timings
|
183
|
-
lastReportedTime = Date.now()
|
184
|
-
lastAmountOfBytesReceived = 0
|
185
|
-
}
|
186
|
-
|
187
|
-
lastAmountOfBytesReceived += buf.byteLength
|
188
|
-
totalBytesReceived += buf.byteLength
|
189
|
-
}
|
190
|
-
*/
|
136
|
+
const downloadStart = Date.now();
|
191
137
|
for await (const buf of stream.source) {
|
192
138
|
if (Date.now() - lastReportedTime > 1000) {
|
193
139
|
yield {
|
@@ -204,6 +150,7 @@ export class Perf {
|
|
204
150
|
lastAmountOfBytesReceived += buf.byteLength;
|
205
151
|
totalBytesReceived += buf.byteLength;
|
206
152
|
}
|
153
|
+
this.log('download complete after %d ms', Date.now() - downloadStart);
|
207
154
|
if (totalBytesReceived !== receiveBytes) {
|
208
155
|
throw new Error(`Expected to receive ${receiveBytes} bytes, but received ${totalBytesReceived}`);
|
209
156
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"perf-service.js","sourceRoot":"","sources":["../../src/perf-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,aAAa,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAOxI,MAAM,OAAO,IAAI;IACE,GAAG,CAAQ;IACZ,QAAQ,CAAQ;IACf,UAAU,CAAgB;IACnC,OAAO,CAAS;IACP,OAAO,CAAa;IACpB,cAAc,CAAQ;IACtB,iBAAiB,CAAQ;IACzB,kBAAkB,CAAQ;IAC1B,wBAAwB,CAAS;IAElD,YAAa,UAA0B,EAAE,OAAiB,EAAE;QAC1D,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;QACxD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,IAAI,aAAa,CAAA;QAClD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,gBAAgB,CAAA;QAC7D,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QACnD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,mBAAmB,CAAA;QACtE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,IAAI,oBAAoB,CAAA;QACzE,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,IAAI,2BAA2B,CAAA;IAC9F,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAwB,EAAE,EAAE;YACjF,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC1C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAA;YAC7D,CAAC,CAAC,CAAA;QACJ,CAAC,EAAE;YACD,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;SACxD,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,aAAa,CAAE,IAAwB;QAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QAEvB,IAAI;
|
1
|
+
{"version":3,"file":"perf-service.js","sourceRoot":"","sources":["../../src/perf-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
{
|
2
2
|
"name": "@libp2p/perf",
|
3
|
-
"version": "2.0.1-
|
3
|
+
"version": "2.0.1-68db79f6b",
|
4
4
|
"description": "Implementation of Perf Protocol",
|
5
5
|
"author": "@maschad / @marcopolo",
|
6
6
|
"license": "Apache-2.0 OR MIT",
|
7
|
-
"homepage": "https://github.com/libp2p/js-libp2p/tree/
|
7
|
+
"homepage": "https://github.com/libp2p/js-libp2p/tree/main/packages/protocol-perf#readme",
|
8
8
|
"repository": {
|
9
9
|
"type": "git",
|
10
10
|
"url": "git+https://github.com/libp2p/js-libp2p.git"
|
@@ -12,6 +12,10 @@
|
|
12
12
|
"bugs": {
|
13
13
|
"url": "https://github.com/libp2p/js-libp2p/issues"
|
14
14
|
},
|
15
|
+
"publishConfig": {
|
16
|
+
"access": "public",
|
17
|
+
"provenance": true
|
18
|
+
},
|
15
19
|
"type": "module",
|
16
20
|
"types": "./dist/src/index.d.ts",
|
17
21
|
"files": [
|
@@ -48,14 +52,14 @@
|
|
48
52
|
"renderResults": "node dist/src/renderResults.js"
|
49
53
|
},
|
50
54
|
"dependencies": {
|
51
|
-
"@libp2p/interface": "0.1.6-
|
52
|
-
"@libp2p/interface-internal": "0.1.9-
|
55
|
+
"@libp2p/interface": "0.1.6-68db79f6b",
|
56
|
+
"@libp2p/interface-internal": "0.1.9-68db79f6b",
|
53
57
|
"@multiformats/multiaddr": "^12.1.10",
|
54
58
|
"it-pushable": "^3.2.3"
|
55
59
|
},
|
56
60
|
"devDependencies": {
|
57
|
-
"@libp2p/interface-compliance-tests": "4.1.5-
|
58
|
-
"@libp2p/logger": "3.1.0-
|
61
|
+
"@libp2p/interface-compliance-tests": "4.1.5-68db79f6b",
|
62
|
+
"@libp2p/logger": "3.1.0-68db79f6b",
|
59
63
|
"aegir": "^41.0.2",
|
60
64
|
"it-last": "^3.0.3",
|
61
65
|
"it-pair": "^2.0.6",
|
package/src/perf-service.ts
CHANGED
@@ -97,16 +97,23 @@ export class Perf implements Startable, PerfInterface {
|
|
97
97
|
const writeBlockSize = this.writeBlockSize
|
98
98
|
|
99
99
|
const initialStartTime = Date.now()
|
100
|
+
let lastReportedTime = Date.now()
|
100
101
|
const connection = await this.components.connectionManager.openConnection(ma, {
|
101
102
|
...options,
|
102
103
|
force: options.reuseExistingConnection !== true
|
103
104
|
})
|
104
105
|
|
106
|
+
this.log('opened connection after %d ms', Date.now() - lastReportedTime)
|
107
|
+
lastReportedTime = Date.now()
|
108
|
+
|
105
109
|
const stream = await connection.newStream(this.protocol, options)
|
106
110
|
|
111
|
+
this.log('opened stream after %d ms', Date.now() - lastReportedTime)
|
112
|
+
lastReportedTime = Date.now()
|
113
|
+
|
107
114
|
let lastAmountOfBytesSent = 0
|
108
|
-
let lastReportedTime = Date.now()
|
109
115
|
let totalBytesSent = 0
|
116
|
+
const uploadStart = Date.now()
|
110
117
|
|
111
118
|
// tell the remote how many bytes we will send. Up cast to 64 bit number
|
112
119
|
// as if we send as ui32 we limit total transfer size to 4GB
|
@@ -160,71 +167,14 @@ export class Perf implements Startable, PerfInterface {
|
|
160
167
|
|
161
168
|
yield * output
|
162
169
|
|
163
|
-
|
164
|
-
const b = byteStream(stream)
|
165
|
-
await b.write(uint8Buf.subarray(0, 8), options)
|
166
|
-
|
167
|
-
while (sendBytes > 0) {
|
168
|
-
let toSend: number = writeBlockSize
|
169
|
-
|
170
|
-
if (toSend > sendBytes) {
|
171
|
-
toSend = sendBytes
|
172
|
-
}
|
173
|
-
|
174
|
-
const chunk = uint8Buf.subarray(0, toSend)
|
175
|
-
|
176
|
-
await b.write(chunk, options)
|
177
|
-
|
178
|
-
sendBytes -= toSend
|
179
|
-
|
180
|
-
if (Date.now() - lastReportedTime > 1000) {
|
181
|
-
yield {
|
182
|
-
type: 'intermediary',
|
183
|
-
timeSeconds: (Date.now() - lastReportedTime) / 1000,
|
184
|
-
uploadBytes: lastAmountOfBytesSent,
|
185
|
-
downloadBytes: 0
|
186
|
-
}
|
187
|
-
|
188
|
-
// record last reported time after `console.log` because it can
|
189
|
-
// affect benchmark timings
|
190
|
-
lastReportedTime = Date.now()
|
191
|
-
lastAmountOfBytesSent = 0
|
192
|
-
}
|
193
|
-
|
194
|
-
lastAmountOfBytesSent += toSend
|
195
|
-
totalBytesSent += toSend
|
196
|
-
}
|
197
|
-
|
198
|
-
// sent all the bytes, close the write end of the stream
|
199
|
-
await b.unwrap().closeWrite()
|
170
|
+
this.log('upload complete after %d ms', Date.now() - uploadStart)
|
200
171
|
|
201
|
-
*/
|
202
172
|
// Read the received bytes
|
203
173
|
let lastAmountOfBytesReceived = 0
|
204
174
|
lastReportedTime = Date.now()
|
205
175
|
let totalBytesReceived = 0
|
206
|
-
|
207
|
-
while (totalBytesReceived < receiveBytes) {
|
208
|
-
const buf = await b.read(1024, options)
|
209
|
-
|
210
|
-
if (Date.now() - lastReportedTime > 1000) {
|
211
|
-
yield {
|
212
|
-
type: 'intermediary',
|
213
|
-
timeSeconds: (Date.now() - lastReportedTime) / 1000,
|
214
|
-
uploadBytes: 0,
|
215
|
-
downloadBytes: lastAmountOfBytesReceived
|
216
|
-
}
|
176
|
+
const downloadStart = Date.now()
|
217
177
|
|
218
|
-
// record last reported time after `console.log` because it can
|
219
|
-
// affect benchmark timings
|
220
|
-
lastReportedTime = Date.now()
|
221
|
-
lastAmountOfBytesReceived = 0
|
222
|
-
}
|
223
|
-
|
224
|
-
lastAmountOfBytesReceived += buf.byteLength
|
225
|
-
totalBytesReceived += buf.byteLength
|
226
|
-
}
|
227
|
-
*/
|
228
178
|
for await (const buf of stream.source) {
|
229
179
|
if (Date.now() - lastReportedTime > 1000) {
|
230
180
|
yield {
|
@@ -244,6 +194,8 @@ export class Perf implements Startable, PerfInterface {
|
|
244
194
|
totalBytesReceived += buf.byteLength
|
245
195
|
}
|
246
196
|
|
197
|
+
this.log('download complete after %d ms', Date.now() - downloadStart)
|
198
|
+
|
247
199
|
if (totalBytesReceived !== receiveBytes) {
|
248
200
|
throw new Error(`Expected to receive ${receiveBytes} bytes, but received ${totalBytesReceived}`)
|
249
201
|
}
|