29 lines
1.4 KiB
JavaScript
29 lines
1.4 KiB
JavaScript
'use strict';
|
|
// Trusted caller supplies its already policy-authorized diagnostics instance.
|
|
// This adapter neither creates an exporter nor configures/enables diagnostics.
|
|
const stages=Object.freeze({
|
|
request:['browser.network','broker.request'],
|
|
framing:['browser.request','broker.framing'],
|
|
buffer:['browser.request','broker.buffer'],
|
|
inspect:['browser.request','broker.inspect'],
|
|
authorize:['browser.network','broker.authorize'],
|
|
forward:['browser.network','broker.forward']
|
|
});
|
|
function createBrokerDiagnostics(diagnostics){
|
|
if(!diagnostics||typeof diagnostics.span!=='function')throw new TypeError('broker_diagnostics_invalid');
|
|
const span=diagnostics.span.bind(diagnostics);
|
|
return Object.freeze({
|
|
wrap(stage,fn,input={}){
|
|
if(!Object.hasOwn(stages,stage)||typeof fn!=='function')throw new TypeError('broker_diagnostics_stage_invalid');
|
|
const [name,operation]=stages[stage],attributes={operation};
|
|
// Data descriptors only: never evaluate untrusted telemetry getters.
|
|
if(input&&typeof input==='object')for(const key of ['bytes','count','policyVersion']){
|
|
const descriptor=Object.getOwnPropertyDescriptor(input,key);
|
|
if(descriptor&&'value'in descriptor&&Number.isSafeInteger(descriptor.value)&&descriptor.value>=0)attributes[key]=descriptor.value;
|
|
}
|
|
return span(name,attributes,fn);
|
|
}
|
|
});
|
|
}
|
|
module.exports={createBrokerDiagnostics};
|