UNPKG

@m-lab/ndt7

Version:

NDT7 client for measuring networks

2 lines (1 loc) 3.26 kB
!function(){"use strict";"undefined"==typeof WebSocket&&(global.WebSocket=require("ws")),"undefined"==typeof fetch&&(global.fetch=require("node-fetch")),"undefined"==typeof Worker&&(global.Worker=require("workerjs"));const e=function(){const e={client_library_name:"ndt7-js",client_library_version:"0.0.6"},r=function(e,r,t){return void 0!==r&&e in r?r[e]:void 0!==t?t:function(){}},t=function(e){throw new Error(e)};async function a(a,o){a.metadata=Object.assign({},a.metadata),a.metadata=Object.assign(a.metadata,e);const n={error:r("error",o,t),serverDiscovery:r("serverDiscovery",o),serverChosen:r("serverChosen",o)};let s="wss";a&&"protocol"in a&&(s=a.protocol);const d=new URLSearchParams(a.metadata);if(a&&"server"in a){const e=new URL(s+"://"+a.server+"/ndt/v7/download"),r=new URL(s+"://"+a.server+"/ndt/v7/upload");return e.search=d,r.search=d,{"///ndt/v7/download":e.toString(),"///ndt/v7/upload":r.toString()}}const c=a&&"loadbalancer"in a?new URL(a.loadbalancer):new URL("https://locate.measurementlab.net/v2/nearest/ndt/ndt7");c.search=d,n.serverDiscovery({loadbalancer:c});const l=await fetch(c).catch((e=>{throw new Error(e)})),i=await l.json();if(!("results"in i))return n.error(`Could not understand response from ${c}: ${i}`),{};const u=i.results[0];return n.serverChosen(u),{"///ndt/v7/download":u.urls[s+":///ndt/v7/download"],"///ndt/v7/upload":u.urls[s+":///ndt/v7/upload"]}}const o=async function(e,r,t,a,o){if(!0!==e.userAcceptedDataPolicy&&!0!==e.mlabDataPolicyInapplicable)return r.error("The M-Lab data policy is applicable and the user has not explicitly accepted that data policy."),1;let n,s;"undefined"!=typeof process&&null!=process.versions&&null!=process.versions.node&&(a=__dirname+"/"+a);const d=new Worker(a),c=new Promise((e=>{d.resolve=function(t){0==t&&r.complete({LastClientMeasurement:n,LastServerMeasurement:s}),d.terminate(),e(t)}})),l=setTimeout((()=>d.resolve(0)),12e3);d.onmessage=function(e){if(e.data&&e.data.MsgType&&"error"!==e.data.MsgType)"start"===e.data.MsgType?r.start(e.data.Data):"measurement"==e.data.MsgType?"server"==e.data.Source?(s=JSON.parse(e.data.ServerMessage),r.measurement({Source:e.data.Source,Data:s})):(n=e.data.ClientData,r.measurement({Source:e.data.Source,Data:e.data.ClientData})):"complete"==e.data.MsgType&&(clearTimeout(l),d.resolve(0));else{clearTimeout(l),d.resolve(1);const t=e.data?e.data.Error:`${o} error`;r.error(t)}};const i=await t.catch((e=>{throw clearTimeout(l),d.resolve(2),e}));return d.postMessage(i),await c};async function n(e,a,n){const s={error:r("error",a,t),start:r("downloadStart",a),measurement:r("downloadMeasurement",a),complete:r("downloadComplete",a)},d=e.downloadworkerfile||"ndt7-download-worker.min.js";return await o(e,s,n,d,"download").catch((e=>{s.error(e)}))}async function s(e,a,n){const s={error:r("error",a,t),start:r("uploadStart",a),measurement:r("uploadMeasurement",a),complete:r("uploadComplete",a)},d=e.uploadworkerfile||"ndt7-upload-worker.min.js";return await o(e,s,n,d,"upload").catch((e=>{s.error(e)}))<<4}return{discoverServerURLs:a,downloadTest:n,uploadTest:s,test:async function(e,r){const t=a(e,r);return await n(e,r,t)+await s(e,r,t)}}}();"undefined"!=typeof module&&void 0!==module.exports?module.exports=e:window.ndt7=e}();