hud-sdk
Version:
Hud's Node SDK
2 lines • 9.01 kB
JavaScript
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var s=t();for(var r in s)("object"==typeof exports?exports:e)[r]=s[r]}}(global,()=>(()=>{"use strict";var e={523:e=>{e.exports=require("./logger")},2312:function(e,t,s){var r,n=this&&this.__createBinding||(Object.create?function(e,t,s,r){void 0===r&&(r=s);var n=Object.getOwnPropertyDescriptor(t,s);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[s]}}),Object.defineProperty(e,r,n)}:function(e,t,s,r){void 0===r&&(r=s),e[r]=t[s]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||(r=function(e){return r=Object.getOwnPropertyNames||function(e){var t=[];for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&(t[t.length]=s);return t},r(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var s=r(e),i=0;i<s.length;i++)"default"!==s[i]&&n(t,e,s[i]);return o(t,e),t});Object.defineProperty(t,"__esModule",{value:!0}),t.HudClient=void 0;const a=s(5809),l=s(2546),u=s(523),d=i(s(8938)),c=s(6982),g=s(6261),f=s(9561),p=s(9023),h=s(3106),_=(0,p.promisify)(h.gzip),m="node-sdk",w=(0,c.randomUUID)();class y{sessionId;httpClient;extensionEventEmitter;static config={baseURL:a.hudConfig.sink.url,timeout:a.hudConfig.sink.timeout,headers:{"Content-Type":"application/json"}};static defaultRequest={version:"1.0.0",source:m,event_version:"1.0.0"};constructor(e){this.httpClient=d.default.create(y.config),this.extensionEventEmitter=e}setSession(e){const{sessionId:t,extraHeaders:s}=e;this.sessionId=t,this.httpClient.defaults.headers.common[a.hudConfig.sink.session_attr]=t;try{for(const[e,t]of Object.entries(s))try{this.httpClient.defaults.headers.common[e]=t}catch(s){u.worker_logger.error("Failed to set extra header",{msg:s instanceof Error?s.message:void 0,stack:s instanceof Error?s.stack:void 0,key:e,value:t})}}catch(e){u.worker_logger.error("Failed to set extra headers",{msg:e instanceof Error?e.message:void 0,stack:e instanceof Error?e.stack:void 0})}}setExtensionEventEmitter(e){this.extensionEventEmitter=e}async logs(e){const t={logs:e,send_time:(new Date).toISOString()};await this._requestRelentless(a.hudConfig.endpoints.logs,t,"logs"),u.worker_logger.debug("sent logs successfully",{size:e.length})}async sessionslessLogs(e,t,s,r){const n={logs:e,send_time:(new Date).toISOString(),token:t,sdk_version:a.SDK_VERSION,sdk_type:m,sdk_runtime_type:r??"sdk",run_id:s??w};await this._requestRelentless(a.hudConfig.endpoints.sessionslessLogs,n,"sessionslessLogs"),u.worker_logger.debug("sent logs successfully",{size:e.length})}async send(e,t,s={}){const r={...y.defaultRequest,type:e,raw:t,send_time:(new Date).toISOString(),...s};await this._requestRelentless(a.hudConfig.endpoints.send,r,e),u.worker_logger.debug("sent event successfully",{type:e})}async batch(e,t,s={}){const r={...y.defaultRequest,type:e,arr:t,send_time:(new Date).toISOString(),...s};await this._requestRelentless(a.hudConfig.endpoints.batch,r,e),u.worker_logger.debug("sent batched events successfully",{type:e})}async getRemoteConfig(){const e=await this._requestDataRelentless(a.hudConfig.endpoints.getRemoteConfig,{},"getRemoteConfig");return u.worker_logger.info("Received remote configuration from server",{remoteConfiguration:e}),e}async getMode(e){const t={extra:e,send_time:(new Date).toISOString()},s=await this._requestDataRelentless(a.hudConfig.endpoints.getMode,t,"getMode");return u.worker_logger.info("Received mode from server "+s),s}async storeObject(e,t){const s={key:e,value:t.toString("base64")},r=await this._requestDataRelentless(a.hudConfig.endpoints.storeObject,s,"storeObject");if("reference"in r)return u.worker_logger.debug("Stored object successfully",{reference:r.reference}),r.reference;u.worker_logger.error("Failed to store object",{key:e,response:r})}async validateToken(e){const t={...y.defaultRequest,token:e,send_time:(new Date).toISOString()};try{return await this._requestRelentless(a.hudConfig.endpoints.validateToken,t,"validateToken"),!0}catch(e){if(e instanceof l.HudClientUnauthorizedError)return!1}return!1}async getUploadUrls(e,t,s){const r={...y.defaultRequest,send_time:(new Date).toISOString(),build_id:e,token:t,num_urls:s};return(await this._requestRelentless(a.hudConfig.endpoints.getUploadUrls,r,"getUploadUrls")).data.urls}async triggerReingest(e){const t={...y.defaultRequest,type:"triggerReingest",send_time:(new Date).toISOString(),build_id:e};await this._requestRelentless(a.hudConfig.endpoints.triggerReingest,t,"triggerReingest")}async completed(e,t){const s={...y.defaultRequest,build_id:e,token:t,send_time:(new Date).toISOString()};await this._requestRelentless(a.hudConfig.endpoints.completed,s,"completed")}async sendFileDeclarationsCi(e,t){u.worker_logger.debug("Sending file declarations request",{count:t.length});const s={...e,files:t},r=await this._requestRelentless(a.hudConfig.endpoints.fileDeclarationsCi,s,"fileDeclarations");return{files:r.data.files,send_all:r.data.send_all}}async sendFileDeclarations(e){u.worker_logger.debug("Sending file declarations request",{count:e.length});const t={files:e},s=await this._requestRelentless(a.hudConfig.endpoints.fileDeclarations,t,"fileDeclarations");return{files:s.data.files,send_all:s.data.send_all}}async getEndpointsDurationsInvestigationThresholds(){return await this._requestDataRelentless(a.hudConfig.endpoints.endpointsDurationsInvestigationThresholds,{},"endpointsDurationsInvestigationThresholds","get")}async _requestRelentless(e,t,s,r="post",n=3){const o={"X-Hud-Type":s,"X-Hud-Request-ID":(0,c.randomUUID)()},i=[];let a;for(let c=0;c<n;c++)try{const n=await this._request(e,t,s,o,r);return(0,l.incrementSentEventsCount)(s),n}catch(t){if(t instanceof Error&&(a=t),t instanceof d.AxiosError){if(401===t.response?.status)throw u.worker_logger.error("Unauthorized request",{endpoint:e,requestType:s}),new l.HudClientUnauthorizedError(`Unauthorized request for ${e}`);const{code:r,name:n,status:o,message:a}=t;i.push({code:r,name:n,status:o,message:a})}else if(t instanceof Error){const{name:e,message:s}=t;i.push({name:e,message:s})}await new Promise(e=>setTimeout(e,1))}throw u.worker_logger.error("Exceeded max retries to request",{endpoint:e,requestType:s,failures:i,retries:n}),new l.HudClientError(`Exceeded max retries for ${e}`,a instanceof d.AxiosError?a.code:void 0)}async _requestDataRelentless(e,t,s,r="post",n=3){return(await this._requestRelentless(e,t,s,r,n)).data}async _request(e,t,s,r,n="post"){try{this.extensionEventEmitter&&await(0,g.once)(this.extensionEventEmitter,"eventloop");const s="get"===n?void 0:await this._gzipCompress(JSON.stringify(t));return r={...r,"Content-Encoding":"gzip","Content-Type":"application/json"},await(0,l.suppressTraces)(async()=>await this.httpClient.request({url:e,method:n,data:s,headers:r}))()}catch(t){if(t instanceof d.AxiosError){const{code:r,name:n,status:o,cause:i,message:a}=t;u.worker_logger.error(`${e} request failed`,{requestType:s,code:r,name:n,status:o,cause:i,msg:a})}else u.worker_logger.error("Caught an unexpected error",{msg:t instanceof Error?t.message:void 0,stack:t instanceof Error?t.stack:void 0});throw t}}async _gzipCompress(e){return _(e)}async initSession(e,t,s,r){const n={token:e,service:t,start_time:s.toISOString(),type:m,version:"1.0.0",sdk_version:a.SDK_VERSION,tags:r};u.worker_logger.debug("Requesting init",{data:n});const o=await this._requestRelentless(a.hudConfig.endpoints.init,n,"init");if(o.status===a.hudConfig.throttleStatusCode)throw u.worker_logger.debug("Init request throttled"),new l.HudSessionThrottle;const i=o.data.sessionId,d=o.data.extraHeaders??{};return u.worker_logger.info("Succesfuly created session with backend",{host:y.config.baseURL,service:t,sessionId:i,extraHeaders:d,tags:r}),{sessionId:i,extraHeaders:d}}async uploadDeclarationsToS3(e,t,s,r){const n=await(0,f.buffer)(e);let o=(await this.getUploadUrls(t,s,1))[0];r(`Got upload url ${o}`);for(let e=1;e<=3;e++)try{return await d.default.put(o,n,{headers:{"Content-Encoding":"gzip","Content-Type":"application/x-ndjson"}}),void r(`Uploaded requests to ${o}`)}catch(n){if(!(d.default.isAxiosError(n)&&405===n.response?.status&&e<3))throw n;r(`Upload failed with 405 status, retrying attempt ${e+1}/3, current upload url: ${o}`),o=(await this.getUploadUrls(t,s,1))[0]}}}t.HudClient=y},2546:e=>{e.exports=require("./lib")},3106:e=>{e.exports=require("zlib")},5809:e=>{e.exports=require("./config")},6261:e=>{e.exports=require("events")},6982:e=>{e.exports=require("crypto")},8938:e=>{e.exports=require("axios")},9023:e=>{e.exports=require("util")},9561:e=>{e.exports=require("stream/consumers")}},t={};return function s(r){var n=t[r];if(void 0!==n)return n.exports;var o=t[r]={exports:{}};return e[r].call(o.exports,o,o.exports,s),o.exports}(2312)})());
//# sourceMappingURL=client.js.map