BREAKING CHANGE(serviceworker): Move serviceworker speedtest to time-based chunked transfers and update dashboard/server contract
This commit is contained in:
@@ -3,6 +3,6 @@
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@api.global/typedserver',
|
||||
version: '6.8.1',
|
||||
version: '7.0.0',
|
||||
description: 'A TypeScript-based project for easy serving of static files with support for live reloading, compression, and typed requests.'
|
||||
}
|
||||
|
||||
@@ -308,31 +308,31 @@ export class TypedServer {
|
||||
);
|
||||
|
||||
// Speedtest handler for service worker dashboard
|
||||
// Client calls this in a loop for the test duration to get accurate time-based measurements
|
||||
this.typedrouter.addTypedHandler<interfaces.serviceworker.IRequest_Serviceworker_Speedtest>(
|
||||
new plugins.typedrequest.TypedHandler('serviceworker_speedtest', async (reqArg) => {
|
||||
const startTime = Date.now();
|
||||
const payloadSizeKB = reqArg.payloadSizeKB || 100;
|
||||
const sizeBytes = payloadSizeKB * 1024;
|
||||
const chunkSizeKB = reqArg.chunkSizeKB || 64;
|
||||
const sizeBytes = chunkSizeKB * 1024;
|
||||
let payload: string | undefined;
|
||||
let bytesTransferred = 0;
|
||||
|
||||
switch (reqArg.type) {
|
||||
case 'download':
|
||||
case 'download_chunk':
|
||||
// Generate chunk data for download test
|
||||
payload = 'x'.repeat(sizeBytes);
|
||||
bytesTransferred = sizeBytes;
|
||||
break;
|
||||
case 'upload':
|
||||
case 'upload_chunk':
|
||||
// Acknowledge received upload data
|
||||
bytesTransferred = reqArg.payload?.length || 0;
|
||||
break;
|
||||
case 'latency':
|
||||
bytesTransferred = 1;
|
||||
// Simple ping - minimal data
|
||||
bytesTransferred = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
const durationMs = Date.now() - startTime;
|
||||
const speedMbps = durationMs > 0 ? (bytesTransferred * 8) / (durationMs * 1000) : 0;
|
||||
|
||||
return { durationMs, bytesTransferred, speedMbps, timestamp: Date.now(), payload };
|
||||
return { bytesTransferred, timestamp: Date.now(), payload };
|
||||
})
|
||||
);
|
||||
} catch (error) {
|
||||
|
||||
@@ -84,43 +84,36 @@ export const addServiceWorkerRoute = (
|
||||
)
|
||||
);
|
||||
|
||||
// Speedtest handler for measuring connection speed
|
||||
// Speedtest handler for measuring connection speed (time-based chunked approach)
|
||||
typedrouter.addTypedHandler(
|
||||
new plugins.typedrequest.TypedHandler<interfaces.serviceworker.IRequest_Serviceworker_Speedtest>(
|
||||
'serviceworker_speedtest',
|
||||
async (reqArg) => {
|
||||
const startTime = Date.now();
|
||||
const payloadSizeKB = reqArg.payloadSizeKB || 100;
|
||||
const sizeBytes = payloadSizeKB * 1024;
|
||||
const chunkSizeKB = reqArg.chunkSizeKB || 64;
|
||||
const sizeBytes = chunkSizeKB * 1024;
|
||||
let payload: string | undefined;
|
||||
let bytesTransferred = 0;
|
||||
|
||||
switch (reqArg.type) {
|
||||
case 'download':
|
||||
// Generate random payload for download test
|
||||
case 'download_chunk':
|
||||
// Generate chunk payload for download test
|
||||
payload = 'x'.repeat(sizeBytes);
|
||||
bytesTransferred = sizeBytes;
|
||||
break;
|
||||
case 'upload':
|
||||
case 'upload_chunk':
|
||||
// For upload, measure bytes received from client
|
||||
bytesTransferred = reqArg.payload?.length || 0;
|
||||
break;
|
||||
case 'latency':
|
||||
// Minimal payload for latency test
|
||||
bytesTransferred = 1;
|
||||
// Simple ping - no payload needed
|
||||
bytesTransferred = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
const durationMs = Date.now() - startTime;
|
||||
// Speed in Mbps: (bytes * 8 bits/byte) / (ms * 1000 to get seconds) / 1,000,000 for Mbps
|
||||
const speedMbps = durationMs > 0 ? (bytesTransferred * 8) / (durationMs * 1000) : 0;
|
||||
|
||||
return {
|
||||
durationMs,
|
||||
bytesTransferred,
|
||||
speedMbps,
|
||||
timestamp: Date.now(),
|
||||
payload, // Only for download tests
|
||||
payload, // Only for download_chunk tests
|
||||
};
|
||||
}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user