@autofleet/settings 3.1.6-beta.0 → 3.1.7

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/dist/index.cjs CHANGED
@@ -1,3 +1,2 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var U=require('@autofleet/network'),M=require('@autofleet/logger'),O=require('node-cache'),b=require('node:events'),I=require('moment'),h3Js=require('h3-js');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var U__default=/*#__PURE__*/_interopDefault(U);var M__default=/*#__PURE__*/_interopDefault(M);var O__default=/*#__PURE__*/_interopDefault(O);var b__default=/*#__PURE__*/_interopDefault(b);var I__default=/*#__PURE__*/_interopDefault(I);var R=Object.defineProperty;var p=(E,r)=>R(E,"name",{value:r,configurable:true});var F=60*5,C="waitingToNetwork",x=p(E=>E||(process.env.SETTING_MS_SERVICE_HOST?`http://${process.env.SETTING_MS_SERVICE_HOST}/`:void 0)||(process.env.NODE_ENV!=="test"?"http://setting-ms.autofleet.io/":"http://localhost:9999/"),"findUrl");function _(E){return E!==C&&typeof E=="object"&&"value"in E}p(_,"isCacheEntry");function $(E){return Object.entries(E).map(([r,o])=>[r.slice(0,r.length-1),Array.from(new Set(o))]).flatMap(([r,o])=>o.map(f=>({[r]:f})))}p($,"convertEntitiesToLabels");var z=["businessModelId","fleetId","demandSourceId","contextId"],K=class extends Error{static{p(this,"CannotGetNetworkValueError");}},H=class N{static{p(this,"SettingsManager");}ttl;settingsCache=new O__default.default;networkEvents=new b__default.default;network;static NEVER_DEFAULT_VALUE="NEVER_DEFAULT_VALUE";NEVER_DEFAULT_VALUE=N.NEVER_DEFAULT_VALUE;disableTestEnvCheck;#t;static readNetworkValue(r,o,f,d){let e=r;if(typeof r>"u"&&(e=o,d.info("Setting falling back to default as network value was defined",{key:f,defaultValue:o})),e===N.NEVER_DEFAULT_VALUE)throw new Error("Cannot find value from network or cache, default value is set to never");return e}constructor({serviceUrl:r,ttl:o=F,disableTestEnvCheck:f=false,logger:d=M__default.default()}={}){let e=x(r);this.#t=d,this.ttl=o,this.disableTestEnvCheck=f,this.network=new U__default.default({serviceUrl:e,logger:d});}async get(r,o,f=[],{timeout:d=5e3,rejectOnFail:e=false}={}){if(typeof o>"u")throw new Error("Can't get a key without defaultValue");let h=this.getCacheKey(r,f),l=this.settingsCache.get(h);if(l!==void 0){if(this.#t.debug("setting found in cache",{cacheKey:h}),C===l){let[c]=await b.once(this.networkEvents,h);if(c instanceof Error&&e)throw c;return N.readNetworkValue(c,o,r,this.#t)}return _(l)?l.value:l}if(!this.disableTestEnvCheck&&process.env.NODE_ENV==="test")return this.#t.info("returning default value setting in TEST mode",{cacheKey:h}),o;let g;try{this.settingsCache.set(h,C,this.ttl),g=(await this.network.get(`/api/v1/settings/get-setting/${r}`,{params:{labels:f.map(t=>JSON.stringify(t))},timeout:d})).data.value;}catch(c){if(this.#t.error("Cant get setting from network",{error:c,rejectOnFail:e,key:r}),e){let t=new K;throw this.networkEvents.emit(h,t),t}}this.networkEvents.emit(h,g);let s;try{s=N.readNetworkValue(g,o,r,this.#t);}catch(c){throw this.settingsCache.del(h),c}return this.settingsCache.set(h,{value:s},this.ttl),s}async getMultiple(r,o,{timeout:f=5e3,rejectOnFail:d=false}={}){let e=new Map,h=new Map,l=new Set,g=new Set;if(r.forEach(s=>{let c=this.getCacheKey(s.key,o);e.set(s.key,c);let t=this.settingsCache.get(c);if(t===void 0){l.add(s.key);return}if(t===C){g.add(s.key);return}h.set(s.key,_(t)?t.value:t);}),process.env.NODE_ENV==="test")return r.map(s=>h.get(s.key)??s.defaultValue);if(g.size){let s=Array.from(g);(await Promise.all(s.map(t=>b.once(this.networkEvents,e.get(t))))).forEach(([t])=>{if(t instanceof Error&&d)throw t;h.set(s.shift(),t);});}if(l.size){let s=Array.from(l);try{s.forEach(t=>this.settingsCache.set(e.get(t),C,this.ttl));let{data:c}=await this.network.post("/api/v1/settings/get-settings/_multiple",{keys:s,labels:o,skipEntityQueryAddition:!0},{timeout:f});s.forEach((t,w)=>{let{value:V}=c[w];h.set(t,V),this.networkEvents.emit(e.get(t),V);});}catch(c){if(this.#t.error("Cant get setting from network",{err:c,settingsToFetch:l,labels:o}),d){let t=new K;throw l.forEach(w=>this.networkEvents.emit(e.get(w),t)),t}}}return r.map(s=>{let c=e.get(s.key),t;try{t=N.readNetworkValue(h.get(s.key),s.defaultValue,s.key,this.#t);}catch(w){throw this.settingsCache.del(c),w}return l.has(s.key)&&this.settingsCache.set(c,{value:t},this.ttl),t})}async getSettingsForMultipleEntities(r,o,{timeout:f=5e3,skipCache:d}={}){let e=r.map(a=>a.key),h=$(o),l=e.flatMap(a=>h.map(i=>[a,i])),g=[],s=[],c=[],t=p((a,i)=>{let u=l.findIndex(([n,y])=>{if(n!==a)return false;let[k,m]=Object.entries(y)[0],[T,v]=Object.entries(i)[0];return k===T&&m===v});u>=0&&l.splice(u,1);},"removeFromSearchList"),w=p(({key:a,label:i,value:u})=>{t(a,i),c.push({key:a,...i,value:u});},"pushToResult"),V=p(({value:a,key:i})=>typeof a<"u"?a:r.find(u=>u.key===i)?.defaultValue,"getValueOrDefault");if(d)g.push(...l);else for(let[a,i]of l){let u=this.getCacheKey(a,[i]),n=this.settingsCache.get(u);n===void 0?g.push([a,i]):n===C?s.push([a,i]):w({key:a,value:_(n)?n.value:n,label:i});}if(s.length){let a=await Promise.all(s.map(async([i,u])=>({values:await b.once(this.networkEvents,this.getCacheKey(i,[u])),key:i,label:u})));for(let{values:[i],key:u,label:n}of a){if(i instanceof Error)throw i;w({key:u,value:i,label:n});}}if(g.length){for(let[n,y]of g)this.settingsCache.set(this.getCacheKey(n,[y]),C,this.ttl);let a=g.reduce((n,[y,k])=>{n.keys.push(y);let[m,T]=Object.entries(k)[0],v=m+"s";return n.entities[v]??=[],n.entities[v].push(T),n},{keys:[],entities:{}}),i;try{i=(await this.network.post("/api/v1/settings/get-settings/_multiple-entities",{...a,skipCache:d},{timeout:f})).data;}catch(n){this.#t.error("Failed to get multiple setting from network",{err:n,toFetch:g});let y=new K;for(let[k,m]of g)this.networkEvents.emit(this.getCacheKey(k,[m]),y);throw y}finally{for(let[n,y]of g)this.settingsCache.del(this.getCacheKey(n,[y]));}let u=Array.isArray(i)?i:[];for(let n of u)for(let y of z){let k=n[y];if(k){let m=V(n),{key:T}=n,v={[y]:k};w({key:T,value:m,label:v});let A=this.getCacheKey(T,[v]);this.settingsCache.set(A,{value:m},this.ttl),this.networkEvents.emit(A,m);}}}let L=l.reduce((a,[i,u])=>{let n=V({value:void 0,key:i});return n&&a.push({key:i,value:n,...u}),a},[]);return [...c,...L]}setLocal(r,o,f){let d=this.getCacheKey(r,o);this.settingsCache.set(d,{value:f},this.ttl);}flush(){return this.settingsCache.flushAll()}getCacheKey(r,o){let f=o.map(e=>{if(e.time)return {...e,time:I__default.default(e.time).startOf("hour").format(),day:I__default.default(e.time).day()};if(e.location?.lat&&e.location?.lng){let h=h3Js.latLngToCell(e.location.lat,e.location.lng,8);return {...e,location:h}}return e});return `${r}_${JSON.stringify(f)}`}},X=H;
2
- exports.CannotGetNetworkValueError=K;exports.default=X;//# sourceMappingURL=index.cjs.map
1
+ Object.defineProperty(exports,`__esModule`,{value:!0});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));const c=s(require(`@autofleet/network`)),l=s(require(`@autofleet/logger`)),u=s(require(`node-cache`)),d=s(require(`node:events`)),f=s(require(`moment`)),p=s(require(`h3-js`)),m=60*5,h=`waitingToNetwork`,g=e=>e||(process.env.SETTING_MS_SERVICE_HOST?`http://${process.env.SETTING_MS_SERVICE_HOST}/`:void 0)||(process.env.NODE_ENV===`test`?`http://localhost:9999/`:`http://setting-ms.autofleet.io/`);function _(e){return Object.entries(e).map(([e,t])=>{let n=e.slice(0,e.length-1);return[n,Array.from(new Set(t))]}).flatMap(([e,t])=>t.map(t=>({[e]:t})))}const v=[`businessModelId`,`fleetId`,`demandSourceId`,`contextId`];var y=class extends Error{},b=class e{ttl;settingsCache=new u.default;networkEvents=new d.default;network;NEVER_DEFAULT_VALUE=e.NEVER_DEFAULT_VALUE;disableTestEnvCheck;#logger;static get NEVER_DEFAULT_VALUE(){return`NEVER_DEFAULT_VALUE`}static readNetworkValue(t,n,r,i){let a=t;if(t===void 0&&(a=n,i.info(`Setting falling back to default as network value was defined`,{key:r,defaultValue:n})),a===e.NEVER_DEFAULT_VALUE)throw Error(`Cannot find value from network or cache, default value is set to never`);return a}constructor({serviceUrl:e,ttl:t=m,disableTestEnvCheck:n=!1,logger:r=(0,l.default)()}={}){let i=g(e);this.#logger=r,this.ttl=t,this.disableTestEnvCheck=n,this.network=new c.default({serviceUrl:i,logger:r})}async get(t,n,r=[],{timeout:i=5e3,rejectOnFail:a=!1}={}){if(n===void 0)throw Error(`Can't get a key without defaultValue`);let o=this.getCacheKey(t,r),s=this.settingsCache.get(o);if(s!==void 0){if(this.#logger.debug(`setting found in cache`,{cacheKey:o}),h===s){let[r]=await(0,d.once)(this.networkEvents,o);if(r instanceof Error&&a)throw r;return e.readNetworkValue(r,n,t,this.#logger)}return s}if(!this.disableTestEnvCheck&&process.env.NODE_ENV===`test`)return this.#logger.info(`returning default value setting in TEST mode`,{cacheKey:o}),n;let c;try{this.settingsCache.set(o,h,this.ttl);let e=await this.network.get(`/api/v1/settings/get-setting/${t}`,{params:{labels:r.map(e=>JSON.stringify(e))},timeout:i});c=e.data.value}catch(e){if(this.#logger.error(`Cant get setting from network`,{error:e,rejectOnFail:a,key:t}),a){let e=new y;throw this.networkEvents.emit(o,e),e}}this.networkEvents.emit(o,c);let l;try{l=e.readNetworkValue(c,n,t,this.#logger)}catch(e){throw this.settingsCache.del(o),e}return this.settingsCache.set(o,l,this.ttl),l}async getMultiple(t,n,{timeout:r=5e3,rejectOnFail:i=!1}={}){let a=new Map,o=new Map,s=new Set,c=new Set;if(t.forEach(e=>{let t=this.getCacheKey(e.key,n);a.set(e.key,t);let r=this.settingsCache.get(t);if(r===void 0){s.add(e.key);return}if(r===h){c.add(e.key);return}o.set(e.key,r)}),process.env.NODE_ENV===`test`)return t.map(e=>o.get(e.key)??e.defaultValue);if(c.size){let e=Array.from(c),t=await Promise.all(e.map(e=>(0,d.once)(this.networkEvents,a.get(e))));t.forEach(([t])=>{if(t instanceof Error&&i)throw t;o.set(e.shift(),t)})}if(s.size){let e=Array.from(s);try{e.forEach(e=>this.settingsCache.set(a.get(e),h,this.ttl));let{data:t}=await this.network.post(`/api/v1/settings/get-settings/_multiple`,{keys:e,labels:n,skipEntityQueryAddition:!0},{timeout:r});e.forEach((e,n)=>{let{value:r}=t[n];o.set(e,r),this.networkEvents.emit(a.get(e),r)})}catch(e){if(this.#logger.error(`Cant get setting from network`,{err:e,settingsToFetch:s,labels:n}),i){let e=new y;throw s.forEach(t=>this.networkEvents.emit(a.get(t),e)),e}}}return t.map(t=>{let n=a.get(t.key),r;try{r=e.readNetworkValue(o.get(t.key),t.defaultValue,t.key,this.#logger)}catch(e){throw this.settingsCache.del(n),e}return s.has(t.key)&&this.settingsCache.set(n,r,this.ttl),r})}async getSettingsForMultipleEntities(e,t,{timeout:n=5e3,skipCache:r}={}){let i=e.map(e=>e.key),a=_(t),o=i.flatMap(e=>a.map(t=>[e,t])),s=[],c=[],l=[],u=(e,t)=>{let n=o.findIndex(([n,r])=>{if(n!==e)return!1;let[i,a]=Object.entries(r)[0],[o,s]=Object.entries(t)[0];return i===o&&a===s});n>=0&&o.splice(n,1)},f=({key:e,label:t,value:n})=>{u(e,t),l.push({key:e,...t,value:n})},p=({value:t,key:n})=>t===void 0?e.find(e=>e.key===n)?.defaultValue:t;if(r)s.push(...o);else for(let[e,t]of o){let n=this.getCacheKey(e,[t]),r=this.settingsCache.get(n);r===void 0?s.push([e,t]):r===h?c.push([e,t]):f({key:e,value:r,label:t})}if(c.length){let e=await Promise.all(c.map(async([e,t])=>{let n=await(0,d.once)(this.networkEvents,this.getCacheKey(e,[t]));return{values:n,key:e,label:t}}));for(let{values:[t],key:n,label:r}of e){if(t instanceof Error)throw t;f({key:n,value:t,label:r})}}if(s.length){for(let[e,t]of s)this.settingsCache.set(this.getCacheKey(e,[t]),h,this.ttl);let e=s.reduce((e,[t,n])=>{e.keys.push(t);let[r,i]=Object.entries(n)[0],a=r+`s`;return e.entities[a]??=[],e.entities[a].push(i),e},{keys:[],entities:{}}),t;try{let i=await this.network.post(`/api/v1/settings/get-settings/_multiple-entities`,{...e,skipCache:r},{timeout:n});t=i.data}catch(e){this.#logger.error(`Failed to get multiple setting from network`,{err:e,toFetch:s});let t=new y;for(let[e,n]of s)this.networkEvents.emit(this.getCacheKey(e,[n]),t);throw t}finally{for(let[e,t]of s)this.settingsCache.del(this.getCacheKey(e,[t]))}let i=Array.isArray(t)?t:[];for(let e of i)for(let t of v){let n=e[t];if(n){let r=p(e),{key:i}=e,a={[t]:n};f({key:i,value:r,label:a});let o=this.getCacheKey(i,[a]);this.settingsCache.set(o,r,this.ttl),this.networkEvents.emit(o,r)}}}let m=o.reduce((e,[t,n])=>{let r=p({value:void 0,key:t});return r&&e.push({key:t,value:r,...n}),e},[]);return[...l,...m]}setLocal(e,t,n){let r=this.getCacheKey(e,t);this.settingsCache.set(r,n,this.ttl)}flush(){return this.settingsCache.flushAll()}getCacheKey(e,t){let n=t.map(e=>{if(e.time)return{...e,time:(0,f.default)(e.time).startOf(`hour`).format(),day:(0,f.default)(e.time).day()};if(e.location?.lat&&e.location?.lng){let t=(0,p.latLngToCell)(e.location.lat,e.location.lng,8);return{...e,location:t}}return e}),r=`${e}_${JSON.stringify(n)}`;return r}},x=b;exports.CannotGetNetworkValueError=y,exports.default=x;
3
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["FIVE_MINUTES","WAITING_TO_NETWORK","findUrl","__name","serviceUrl","process","env","SETTING_MS_SERVICE_HOST","undefined","NODE_ENV","isCacheEntry","value","convertEntitiesToLabels","entities","Object","entries","map","entity","ids","slice","length","Array","from","Set","flatMap","id","ENTITY_ID_NAMES","CannotGetNetworkValueError","Error","SettingsManager","ttl","settingsCache","NodeCache","networkEvents","EventEmitter","network","NEVER_DEFAULT_VALUE","disableTestEnvCheck","#logger","readNetworkValue","networkValue","defaultValue","key","logger","returnValue","info","constructor","Logger","localServiceUrl","Network","get","labels","timeout","rejectOnFail","cacheKey","getCacheKey","cacheValue","debug","once","set","params","label","JSON","stringify","data","error","errorToThrow","emit","e","del","getMultiple","settingsToGet","cacheKeyCache","Map","settingsToReturn","settingsToFetch","cachedSettingsToAwait","forEach","obj","add","size","keys","Promise","all","shift","values","post","skipEntityQueryAddition","index","err","setting","has","getSettingsForMultipleEntities","skipCache","s","searchList","toFetch","waitingToNetwork","result","removeFromSearchList","findIndex","itemKey","itemLabel","itemEntityKey","itemEntityId","entityKey","entityId","splice","pushToResult","push","getValueOrDefault","find","networkResults","toFetchReduced","reduce","acc","entitiesKey","settingsArr","isArray","defaults","setLocal","flush","flushAll","newLabels","l","time","moment","startOf","format","day","location","lat","lng","h3Index","latLngToCell","index_default"],"mappings":"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","file":"index.cjs","sourcesContent":["import Network from '@autofleet/network';\nimport Logger, { type LoggerInstanceManager } from '@autofleet/logger';\nimport NodeCache from 'node-cache';\nimport EventEmitter, { once } from 'node:events';\nimport moment from 'moment';\nimport { latLngToCell } from 'h3-js';\n\nconst FIVE_MINUTES = 60 * 5;\n\nconst WAITING_TO_NETWORK = 'waitingToNetwork';\ntype WaitingToNetwork = typeof WAITING_TO_NETWORK;\n\nconst findUrl = (serviceUrl?: string) => serviceUrl\n || (process.env.SETTING_MS_SERVICE_HOST ? `http://${process.env.SETTING_MS_SERVICE_HOST}/` : undefined)\n /* c8 ignore next */\n || (process.env.NODE_ENV !== 'test' ? 'http://setting-ms.autofleet.io/' : 'http://localhost:9999/');\n\ninterface SettingsClassOptions {\n serviceUrl?: string;\n ttl?: number;\n disableTestEnvCheck?: boolean;\n logger?: LoggerInstanceManager;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\ntype SettingValue = string | boolean | number | any[] | any;\n\ninterface CacheEntry {\n value: SettingValue;\n}\n\ntype CacheValue = CacheEntry | WaitingToNetwork;\n\nfunction isCacheEntry(value: CacheValue): value is CacheEntry {\n return value !== WAITING_TO_NETWORK && typeof value === 'object' && 'value' in value;\n}\n\ninterface Location {\n lat: number;\n lng: number;\n}\nexport interface Label {\n businessModelId?: string;\n demandSourceId?: string;\n fleetId?: string;\n vendorId?: string;\n time?: string | Date;\n location?: Location;\n contextId?: string;\n}\n\nexport interface Entities {\n businessModelIds?: string[];\n fleetIds?: string[];\n demandSourceIds?: string[];\n contextIds?: string[];\n}\n\nfunction convertEntitiesToLabels(entities: Entities): Label[] {\n return Object.entries(entities)\n .map<[string, string[]]>(([entity, ids]) => {\n // change to singular, example: 'fleetIds' -> 'fleetId'\n const singularEntity = entity.slice(0, entity.length - 1);\n // make sure ids are unique\n return [singularEntity, Array.from(new Set(ids))];\n })\n .flatMap<Label>(([entity, ids]) => ids.map(id => ({ [entity]: id })));\n}\n\nconst ENTITY_ID_NAMES = [\n 'businessModelId',\n 'fleetId',\n 'demandSourceId',\n 'contextId',\n] as const;\n\nexport type ValueByEntity = {\n key: string;\n value: SettingValue;\n} & Partial<Record<(typeof ENTITY_ID_NAMES)[number], string>>;\n\ninterface GetSettingOption {\n timeout?: number;\n rejectOnFail?: boolean;\n}\n\nexport class CannotGetNetworkValueError extends Error {}\n\nclass SettingsManager {\n readonly ttl: number;\n\n readonly settingsCache: NodeCache = new NodeCache();\n\n private readonly networkEvents = new EventEmitter();\n\n readonly network: Network;\n\n static readonly NEVER_DEFAULT_VALUE = 'NEVER_DEFAULT_VALUE';\n\n readonly NEVER_DEFAULT_VALUE: SettingValue = SettingsManager.NEVER_DEFAULT_VALUE;\n\n readonly disableTestEnvCheck: boolean;\n\n readonly #logger: LoggerInstanceManager;\n\n static readNetworkValue(networkValue: SettingValue, defaultValue: SettingValue, key: string, logger: LoggerInstanceManager): SettingValue {\n let returnValue = networkValue;\n if (typeof networkValue === 'undefined') {\n returnValue = defaultValue;\n logger.info('Setting falling back to default as network value was defined', { key, defaultValue });\n }\n\n if (returnValue === SettingsManager.NEVER_DEFAULT_VALUE) {\n throw new Error('Cannot find value from network or cache, default value is set to never');\n }\n\n return returnValue;\n }\n\n constructor({\n serviceUrl, ttl = FIVE_MINUTES, disableTestEnvCheck = false, logger = Logger(),\n }: SettingsClassOptions = {}) {\n const localServiceUrl = findUrl(serviceUrl);\n\n this.#logger = logger;\n this.ttl = ttl;\n this.disableTestEnvCheck = disableTestEnvCheck;\n this.network = new Network({\n serviceUrl: localServiceUrl, logger,\n });\n }\n\n async get(\n key: SettingValue,\n defaultValue?: SettingValue,\n labels: Label[] = [],\n { timeout = 5000, rejectOnFail = false }: GetSettingOption = {},\n ): Promise<SettingValue> {\n if (typeof defaultValue === 'undefined') {\n throw new Error('Can\\'t get a key without defaultValue');\n }\n\n const cacheKey = this.getCacheKey(key, labels);\n const cacheValue = this.settingsCache.get<CacheValue>(cacheKey);\n if (cacheValue !== undefined) {\n this.#logger.debug('setting found in cache', { cacheKey });\n if (WAITING_TO_NETWORK === cacheValue) {\n const [networkValue] = await once(this.networkEvents, cacheKey);\n if (networkValue instanceof Error && rejectOnFail) {\n throw networkValue;\n }\n return SettingsManager.readNetworkValue(networkValue, defaultValue, key, this.#logger);\n }\n return isCacheEntry(cacheValue) ? cacheValue.value : cacheValue;\n }\n\n if (!this.disableTestEnvCheck && process.env.NODE_ENV === 'test') {\n this.#logger.info('returning default value setting in TEST mode', { cacheKey });\n return defaultValue;\n }\n\n let networkValue;\n try {\n this.settingsCache.set(cacheKey, WAITING_TO_NETWORK, this.ttl);\n const networkResponse = await this.network.get(`/api/v1/settings/get-setting/${key}`, {\n params: {\n labels: labels.map(label => JSON.stringify(label)),\n },\n timeout,\n });\n networkValue = networkResponse.data.value;\n } catch (error) {\n this.#logger.error('Cant get setting from network', { error, rejectOnFail, key });\n if (rejectOnFail) {\n const errorToThrow = new CannotGetNetworkValueError();\n this.networkEvents.emit(cacheKey, errorToThrow);\n throw errorToThrow;\n }\n }\n\n this.networkEvents.emit(cacheKey, networkValue);\n let returnValue;\n try {\n returnValue = SettingsManager.readNetworkValue(networkValue, defaultValue, key, this.#logger);\n } catch (e) {\n this.settingsCache.del(cacheKey);\n throw e;\n }\n this.settingsCache.set(cacheKey, { value: returnValue }, this.ttl);\n return returnValue;\n }\n\n async getMultiple(\n settingsToGet: { key: string; defaultValue: SettingValue; }[],\n labels: Label[],\n { timeout = 5000, rejectOnFail = false }: GetSettingOption = {},\n ): Promise<SettingValue[]> {\n const cacheKeyCache = new Map<string, string>();\n const settingsToReturn = new Map();\n const settingsToFetch = new Set<string>();\n const cachedSettingsToAwait = new Set<string>();\n\n settingsToGet.forEach((obj) => {\n const cacheKey = this.getCacheKey(obj.key, labels);\n cacheKeyCache.set(obj.key, cacheKey);\n const cacheValue = this.settingsCache.get<CacheValue>(cacheKey);\n if (cacheValue === undefined) {\n settingsToFetch.add(obj.key);\n return;\n }\n if (cacheValue === WAITING_TO_NETWORK) {\n cachedSettingsToAwait.add(obj.key);\n return;\n }\n settingsToReturn.set(obj.key, isCacheEntry(cacheValue) ? cacheValue.value : cacheValue);\n });\n\n if (process.env.NODE_ENV === 'test') {\n return settingsToGet.map(obj => settingsToReturn.get(obj.key) ?? obj.defaultValue);\n }\n\n if (cachedSettingsToAwait.size) {\n const keys = Array.from(cachedSettingsToAwait);\n const cached = await Promise.all(keys.map(key => once(this.networkEvents, cacheKeyCache.get(key)!)));\n cached.forEach(([networkValue]) => {\n if (networkValue instanceof Error && rejectOnFail) {\n throw networkValue;\n }\n settingsToReturn.set(keys.shift()!, networkValue);\n });\n }\n\n if (settingsToFetch.size) {\n const keys = Array.from(settingsToFetch);\n try {\n keys.forEach(key => this.settingsCache.set(cacheKeyCache.get(key)!, WAITING_TO_NETWORK, this.ttl));\n const { data: values } = await this.network.post<SettingValue[]>('/api/v1/settings/get-settings/_multiple', {\n keys,\n labels,\n skipEntityQueryAddition: true,\n }, {\n timeout,\n });\n\n keys.forEach((key, index) => {\n const { value } = values[index];\n settingsToReturn.set(key, value);\n this.networkEvents.emit(cacheKeyCache.get(key)!, value);\n });\n } catch (err) {\n this.#logger.error('Cant get setting from network', { err, settingsToFetch, labels });\n if (rejectOnFail) {\n const errorToThrow = new CannotGetNetworkValueError();\n settingsToFetch.forEach(key => this.networkEvents.emit(cacheKeyCache.get(key)!, errorToThrow));\n throw errorToThrow;\n }\n }\n }\n\n return settingsToGet.map((setting) => {\n const cacheKey = cacheKeyCache.get(setting.key)!;\n let returnValue;\n try {\n returnValue = SettingsManager.readNetworkValue(settingsToReturn.get(setting.key), setting.defaultValue, setting.key, this.#logger);\n } catch (err) {\n this.settingsCache.del(cacheKey);\n throw err;\n }\n if (settingsToFetch.has(setting.key)) {\n this.settingsCache.set(cacheKey, { value: returnValue }, this.ttl);\n }\n return returnValue;\n });\n }\n\n async getSettingsForMultipleEntities(\n settingsToGet: { key: string; defaultValue?: SettingValue; }[],\n entities: Entities,\n { timeout = 5000, skipCache }: { timeout?: number; skipCache?: boolean; } = {},\n ): Promise<ValueByEntity[]> {\n const keys = settingsToGet.map(s => s.key);\n\n const labels = convertEntitiesToLabels(entities);\n\n /** Cartesian product of `keys` & `labels` */\n const searchList = keys.flatMap(key => labels.map<[string, Label]>(label => ([key, label])));\n\n const toFetch: [string, Label][] = [];\n const waitingToNetwork: [string, Label][] = [];\n const result: ValueByEntity[] = [];\n\n const removeFromSearchList = (key: string, label: Label) => {\n const index = searchList.findIndex(([itemKey, itemLabel]) => {\n if (itemKey !== key) {\n return false;\n }\n const [itemEntityKey, itemEntityId] = Object.entries(itemLabel)[0];\n const [entityKey, entityId] = Object.entries(label)[0];\n return itemEntityKey === entityKey && itemEntityId === entityId;\n });\n if (index >= 0) {\n searchList.splice(index, 1);\n }\n };\n\n const pushToResult = ({ key, label, value }: { key: string; label: Label; value: SettingValue; }) => {\n removeFromSearchList(key, label);\n result.push({ key, ...label, value });\n };\n\n const getValueOrDefault = ({ value, key }: { value: unknown; key: string; }) => {\n if (typeof value !== 'undefined') {\n return value;\n }\n return settingsToGet.find(s => s.key === key)?.defaultValue;\n };\n\n if (skipCache) {\n toFetch.push(...searchList);\n } else {\n for (const [key, label] of searchList) {\n const cacheKey = this.getCacheKey(key, [label]);\n const cacheValue = this.settingsCache.get<CacheValue>(cacheKey);\n\n if (cacheValue === undefined) {\n toFetch.push([key, label]);\n } else if (cacheValue === WAITING_TO_NETWORK) {\n waitingToNetwork.push([key, label]);\n } else {\n pushToResult({ key, value: isCacheEntry(cacheValue) ? cacheValue.value : cacheValue, label });\n }\n }\n }\n\n if (waitingToNetwork.length) {\n const networkResults = await Promise.all(waitingToNetwork.map(async ([key, label]) => {\n const values = await once(this.networkEvents, this.getCacheKey(key, [label]));\n return { values, key, label };\n }));\n\n for (const { values: [networkValue], key, label } of networkResults) {\n if (networkValue instanceof Error) {\n throw networkValue;\n }\n pushToResult({ key, value: networkValue, label });\n }\n }\n\n if (toFetch.length) {\n for (const [key, label] of toFetch) {\n this.settingsCache.set(this.getCacheKey(key, [label]), WAITING_TO_NETWORK, this.ttl);\n }\n\n const toFetchReduced = toFetch.reduce<{ keys: string[]; entities: Entities; }>((acc, [key, label]) => {\n acc.keys.push(key);\n const [entityKey, entityId] = Object.entries(label)[0];\n const entitiesKey = entityKey + 's' as keyof Entities;\n acc.entities[entitiesKey] ??= [];\n acc.entities[entitiesKey].push(entityId);\n return acc;\n }, { keys: [], entities: {} });\n\n let data;\n try {\n const res = await this.network.post('/api/v1/settings/get-settings/_multiple-entities', { ...toFetchReduced, skipCache }, { timeout });\n data = res.data;\n } catch (err) {\n this.#logger.error('Failed to get multiple setting from network', { err, toFetch });\n const errorToThrow = new CannotGetNetworkValueError();\n for (const [key, label] of toFetch) {\n this.networkEvents.emit(this.getCacheKey(key, [label]), errorToThrow);\n }\n throw errorToThrow;\n } finally {\n // clean all WAITING_TO_NETWORK\n for (const [key, label] of toFetch) {\n this.settingsCache.del(this.getCacheKey(key, [label]));\n }\n }\n\n const settingsArr = Array.isArray(data) ? data : [];\n for (const setting of settingsArr) {\n for (const entity of ENTITY_ID_NAMES) {\n const entityId = setting[entity];\n if (entityId) {\n const value = getValueOrDefault(setting);\n const { key } = setting;\n const label = { [entity]: entityId };\n\n pushToResult({ key, value, label });\n\n const cacheKey = this.getCacheKey(key, [label]);\n this.settingsCache.set(cacheKey, { value }, this.ttl);\n this.networkEvents.emit(cacheKey, value);\n }\n }\n }\n }\n\n const defaults = searchList.reduce<ValueByEntity[]>((acc, [key, label]) => {\n const value = getValueOrDefault({ value: undefined, key });\n if (value) {\n acc.push({ key, value, ...label });\n }\n return acc;\n }, []);\n return [...result, ...defaults];\n }\n\n setLocal(key: string, labels: Label[], value: SettingValue): void {\n const cacheKey = this.getCacheKey(key, labels);\n this.settingsCache.set(cacheKey, { value }, this.ttl);\n }\n\n flush(): void {\n return this.settingsCache.flushAll();\n }\n\n getCacheKey(key: SettingValue, labels: Label[]): string {\n const newLabels = labels.map((l) => {\n if (l.time) {\n return {\n ...l,\n time: moment(l.time).startOf('hour').format(),\n day: moment(l.time).day(),\n };\n }\n\n if (l.location?.lat && l.location?.lng) {\n const h3Index = latLngToCell(l.location.lat, l.location.lng, 8);\n return {\n ...l,\n location: h3Index,\n };\n }\n\n return l;\n });\n\n const cacheKey = `${key}_${JSON.stringify(newLabels)}`;\n return cacheKey;\n }\n}\n\nexport default SettingsManager;\n"]}
1
+ {"version":3,"file":"index.cjs","names":["serviceUrl?: string","entities: Entities","NodeCache","EventEmitter","#logger","networkValue: SettingValue","defaultValue: SettingValue","key: string","logger: LoggerInstanceManager","Network","key: SettingValue","defaultValue?: SettingValue","labels: Label[]","networkValue","settingsToGet: { key: string; defaultValue: SettingValue; }[]","settingsToGet: { key: string; defaultValue?: SettingValue; }[]","toFetch: [string, Label][]","waitingToNetwork: [string, Label][]","result: ValueByEntity[]","label: Label","value: SettingValue"],"sources":["../src/index.ts"],"sourcesContent":["import Network from '@autofleet/network';\nimport Logger, { type LoggerInstanceManager } from '@autofleet/logger';\nimport NodeCache from 'node-cache';\nimport EventEmitter, { once } from 'node:events';\nimport moment from 'moment';\nimport { latLngToCell } from 'h3-js';\n\nconst FIVE_MINUTES = 60 * 5;\nconst WAITING_TO_NETWORK = 'waitingToNetwork';\n\nconst findUrl = (serviceUrl?: string) => serviceUrl\n || (process.env.SETTING_MS_SERVICE_HOST ? `http://${process.env.SETTING_MS_SERVICE_HOST}/` : undefined)\n /* c8 ignore next */\n || (process.env.NODE_ENV !== 'test' ? 'http://setting-ms.autofleet.io/' : 'http://localhost:9999/');\n\ninterface SettingsClassOptions {\n serviceUrl?: string;\n ttl?: number;\n disableTestEnvCheck?: boolean;\n logger?: LoggerInstanceManager;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\ntype SettingValue = string | boolean | number | any[] | any;\n\ninterface Location {\n lat: number;\n lng: number;\n}\nexport interface Label {\n businessModelId?: string;\n demandSourceId?: string;\n fleetId?: string;\n vendorId?: string;\n time?: string | Date;\n location?: Location;\n contextId?: string;\n}\n\nexport interface Entities {\n businessModelIds?: string[];\n fleetIds?: string[];\n demandSourceIds?: string[];\n contextIds?: string[];\n}\n\nfunction convertEntitiesToLabels(entities: Entities): Label[] {\n return Object.entries(entities)\n .map<[string, string[]]>(([entity, ids]) => {\n // change to singular, example: 'fleetIds' -> 'fleetId'\n const singularEntity = entity.slice(0, entity.length - 1);\n // make sure ids are unique\n return [singularEntity, Array.from(new Set(ids))];\n })\n .flatMap<Label>(([entity, ids]) => ids.map(id => ({ [entity]: id })));\n}\n\nconst ENTITY_ID_NAMES = [\n 'businessModelId',\n 'fleetId',\n 'demandSourceId',\n 'contextId',\n] as const;\n\nexport type ValueByEntity = {\n key: string;\n value: SettingValue;\n} & Partial<Record<(typeof ENTITY_ID_NAMES)[number], string>>;\n\ninterface GetSettingOption {\n timeout?: number;\n rejectOnFail?: boolean;\n}\n\nexport class CannotGetNetworkValueError extends Error {}\n\nclass SettingsManager {\n readonly ttl: number;\n\n readonly settingsCache: NodeCache = new NodeCache();\n\n private readonly networkEvents = new EventEmitter();\n\n readonly network: Network;\n\n readonly NEVER_DEFAULT_VALUE: typeof SettingsManager.NEVER_DEFAULT_VALUE = SettingsManager.NEVER_DEFAULT_VALUE;\n\n readonly disableTestEnvCheck: boolean;\n\n readonly #logger: LoggerInstanceManager;\n\n // eslint-disable-next-line @typescript-eslint/class-literal-property-style\n static get NEVER_DEFAULT_VALUE(): 'NEVER_DEFAULT_VALUE' {\n return 'NEVER_DEFAULT_VALUE';\n }\n\n static readNetworkValue(networkValue: SettingValue, defaultValue: SettingValue, key: string, logger: LoggerInstanceManager): SettingValue {\n let returnValue = networkValue;\n if (typeof networkValue === 'undefined') {\n returnValue = defaultValue;\n logger.info('Setting falling back to default as network value was defined', { key, defaultValue });\n }\n\n if (returnValue === SettingsManager.NEVER_DEFAULT_VALUE) {\n throw new Error('Cannot find value from network or cache, default value is set to never');\n }\n\n return returnValue;\n }\n\n constructor({\n serviceUrl, ttl = FIVE_MINUTES, disableTestEnvCheck = false, logger = Logger(),\n }: SettingsClassOptions = {}) {\n const localServiceUrl = findUrl(serviceUrl);\n\n this.#logger = logger;\n this.ttl = ttl;\n this.disableTestEnvCheck = disableTestEnvCheck;\n this.network = new Network({\n serviceUrl: localServiceUrl, logger,\n });\n }\n\n async get(\n key: SettingValue,\n defaultValue?: SettingValue,\n labels: Label[] = [],\n { timeout = 5000, rejectOnFail = false }: GetSettingOption = {},\n ): Promise<SettingValue> {\n if (typeof defaultValue === 'undefined') {\n throw new Error('Can\\'t get a key without defaultValue');\n }\n\n const cacheKey = this.getCacheKey(key, labels);\n const cacheValue = this.settingsCache.get(cacheKey);\n if (cacheValue !== undefined) {\n this.#logger.debug('setting found in cache', { cacheKey });\n if (WAITING_TO_NETWORK === cacheValue) {\n const [networkValue] = await once(this.networkEvents, cacheKey);\n if (networkValue instanceof Error && rejectOnFail) {\n throw networkValue;\n }\n return SettingsManager.readNetworkValue(networkValue, defaultValue, key, this.#logger);\n }\n return cacheValue;\n }\n\n if (!this.disableTestEnvCheck && process.env.NODE_ENV === 'test') {\n this.#logger.info('returning default value setting in TEST mode', { cacheKey });\n return defaultValue;\n }\n\n let networkValue;\n try {\n this.settingsCache.set(cacheKey, WAITING_TO_NETWORK, this.ttl);\n const networkResponse = await this.network.get(`/api/v1/settings/get-setting/${key}`, {\n params: {\n labels: labels.map(label => JSON.stringify(label)),\n },\n timeout,\n });\n networkValue = networkResponse.data.value;\n } catch (error) {\n this.#logger.error('Cant get setting from network', { error, rejectOnFail, key });\n if (rejectOnFail) {\n const errorToThrow = new CannotGetNetworkValueError();\n this.networkEvents.emit(cacheKey, errorToThrow);\n throw errorToThrow;\n }\n }\n\n this.networkEvents.emit(cacheKey, networkValue);\n let returnValue;\n try {\n returnValue = SettingsManager.readNetworkValue(networkValue, defaultValue, key, this.#logger);\n } catch (e) {\n this.settingsCache.del(cacheKey);\n throw e;\n }\n this.settingsCache.set(cacheKey, returnValue, this.ttl);\n return returnValue;\n }\n\n async getMultiple(\n settingsToGet: { key: string; defaultValue: SettingValue; }[],\n labels: Label[],\n { timeout = 5000, rejectOnFail = false }: GetSettingOption = {},\n ): Promise<SettingValue[]> {\n const cacheKeyCache = new Map<string, string>();\n const settingsToReturn = new Map();\n const settingsToFetch = new Set<string>();\n const cachedSettingsToAwait = new Set<string>();\n\n settingsToGet.forEach((obj) => {\n const cacheKey = this.getCacheKey(obj.key, labels);\n cacheKeyCache.set(obj.key, cacheKey);\n const cacheValue = this.settingsCache.get(cacheKey);\n if (cacheValue === undefined) {\n settingsToFetch.add(obj.key);\n return;\n }\n if (cacheValue === WAITING_TO_NETWORK) {\n cachedSettingsToAwait.add(obj.key);\n return;\n }\n settingsToReturn.set(obj.key, cacheValue);\n });\n\n if (process.env.NODE_ENV === 'test') {\n return settingsToGet.map(obj => settingsToReturn.get(obj.key) ?? obj.defaultValue);\n }\n\n if (cachedSettingsToAwait.size) {\n const keys = Array.from(cachedSettingsToAwait);\n const cached = await Promise.all(keys.map(key => once(this.networkEvents, cacheKeyCache.get(key)!)));\n cached.forEach(([networkValue]) => {\n if (networkValue instanceof Error && rejectOnFail) {\n throw networkValue;\n }\n settingsToReturn.set(keys.shift()!, networkValue);\n });\n }\n\n if (settingsToFetch.size) {\n const keys = Array.from(settingsToFetch);\n try {\n keys.forEach(key => this.settingsCache.set(cacheKeyCache.get(key)!, WAITING_TO_NETWORK, this.ttl));\n const { data: values } = await this.network.post<SettingValue[]>('/api/v1/settings/get-settings/_multiple', {\n keys,\n labels,\n skipEntityQueryAddition: true,\n }, {\n timeout,\n });\n\n keys.forEach((key, index) => {\n const { value } = values[index];\n settingsToReturn.set(key, value);\n this.networkEvents.emit(cacheKeyCache.get(key)!, value);\n });\n } catch (err) {\n this.#logger.error('Cant get setting from network', { err, settingsToFetch, labels });\n if (rejectOnFail) {\n const errorToThrow = new CannotGetNetworkValueError();\n settingsToFetch.forEach(key => this.networkEvents.emit(cacheKeyCache.get(key)!, errorToThrow));\n throw errorToThrow;\n }\n }\n }\n\n return settingsToGet.map((setting) => {\n const cacheKey = cacheKeyCache.get(setting.key)!;\n let returnValue;\n try {\n returnValue = SettingsManager.readNetworkValue(settingsToReturn.get(setting.key), setting.defaultValue, setting.key, this.#logger);\n } catch (err) {\n this.settingsCache.del(cacheKey);\n throw err;\n }\n if (settingsToFetch.has(setting.key)) {\n this.settingsCache.set(cacheKey, returnValue, this.ttl);\n }\n return returnValue;\n });\n }\n\n async getSettingsForMultipleEntities(\n settingsToGet: { key: string; defaultValue?: SettingValue; }[],\n entities: Entities,\n { timeout = 5000, skipCache }: { timeout?: number; skipCache?: boolean; } = {},\n ): Promise<ValueByEntity[]> {\n const keys = settingsToGet.map(s => s.key);\n\n const labels = convertEntitiesToLabels(entities);\n\n /** Cartesian product of `keys` & `labels` */\n const searchList = keys.flatMap(key => labels.map<[string, Label]>(label => ([key, label])));\n\n const toFetch: [string, Label][] = [];\n const waitingToNetwork: [string, Label][] = [];\n const result: ValueByEntity[] = [];\n\n const removeFromSearchList = (key: string, label: Label) => {\n const index = searchList.findIndex(([itemKey, itemLabel]) => {\n if (itemKey !== key) {\n return false;\n }\n const [itemEntityKey, itemEntityId] = Object.entries(itemLabel)[0];\n const [entityKey, entityId] = Object.entries(label)[0];\n return itemEntityKey === entityKey && itemEntityId === entityId;\n });\n if (index >= 0) {\n searchList.splice(index, 1);\n }\n };\n\n const pushToResult = ({ key, label, value }: { key: string; label: Label; value: SettingValue; }) => {\n removeFromSearchList(key, label);\n result.push({ key, ...label, value });\n };\n\n const getValueOrDefault = ({ value, key }: { value: unknown; key: string; }) => {\n if (typeof value !== 'undefined') {\n return value;\n }\n return settingsToGet.find(s => s.key === key)?.defaultValue;\n };\n\n if (skipCache) {\n toFetch.push(...searchList);\n } else {\n for (const [key, label] of searchList) {\n const cacheKey = this.getCacheKey(key, [label]);\n const cacheValue = this.settingsCache.get(cacheKey);\n\n if (cacheValue === undefined) {\n toFetch.push([key, label]);\n } else if (cacheValue === WAITING_TO_NETWORK) {\n waitingToNetwork.push([key, label]);\n } else {\n pushToResult({ key, value: cacheValue, label });\n }\n }\n }\n\n if (waitingToNetwork.length) {\n const networkResults = await Promise.all(waitingToNetwork.map(async ([key, label]) => {\n const values = await once(this.networkEvents, this.getCacheKey(key, [label]));\n return { values, key, label };\n }));\n\n for (const { values: [networkValue], key, label } of networkResults) {\n if (networkValue instanceof Error) {\n throw networkValue;\n }\n pushToResult({ key, value: networkValue, label });\n }\n }\n\n if (toFetch.length) {\n for (const [key, label] of toFetch) {\n this.settingsCache.set(this.getCacheKey(key, [label]), WAITING_TO_NETWORK, this.ttl);\n }\n\n const toFetchReduced = toFetch.reduce<{ keys: string[]; entities: Entities; }>((acc, [key, label]) => {\n acc.keys.push(key);\n const [entityKey, entityId] = Object.entries(label)[0];\n const entitiesKey = entityKey + 's' as keyof Entities;\n acc.entities[entitiesKey] ??= [];\n acc.entities[entitiesKey].push(entityId);\n return acc;\n }, { keys: [], entities: {} });\n\n let data;\n try {\n const res = await this.network.post('/api/v1/settings/get-settings/_multiple-entities', { ...toFetchReduced, skipCache }, { timeout });\n data = res.data;\n } catch (err) {\n this.#logger.error('Failed to get multiple setting from network', { err, toFetch });\n const errorToThrow = new CannotGetNetworkValueError();\n for (const [key, label] of toFetch) {\n this.networkEvents.emit(this.getCacheKey(key, [label]), errorToThrow);\n }\n throw errorToThrow;\n } finally {\n // clean all WAITING_TO_NETWORK\n for (const [key, label] of toFetch) {\n this.settingsCache.del(this.getCacheKey(key, [label]));\n }\n }\n\n const settingsArr = Array.isArray(data) ? data : [];\n for (const setting of settingsArr) {\n for (const entity of ENTITY_ID_NAMES) {\n const entityId = setting[entity];\n if (entityId) {\n const value = getValueOrDefault(setting);\n const { key } = setting;\n const label = { [entity]: entityId };\n\n pushToResult({ key, value, label });\n\n const cacheKey = this.getCacheKey(key, [label]);\n this.settingsCache.set(cacheKey, value, this.ttl);\n this.networkEvents.emit(cacheKey, value);\n }\n }\n }\n }\n\n const defaults = searchList.reduce<ValueByEntity[]>((acc, [key, label]) => {\n const value = getValueOrDefault({ value: undefined, key });\n if (value) {\n acc.push({ key, value, ...label });\n }\n return acc;\n }, []);\n return [...result, ...defaults];\n }\n\n setLocal(key: string, labels: Label[], value: SettingValue): void {\n const cacheKey = this.getCacheKey(key, labels);\n this.settingsCache.set<SettingValue>(cacheKey, value, this.ttl);\n }\n\n flush(): void {\n return this.settingsCache.flushAll();\n }\n\n getCacheKey(key: SettingValue, labels: Label[]): string {\n const newLabels = labels.map((l) => {\n if (l.time) {\n return {\n ...l,\n time: moment(l.time).startOf('hour').format(),\n day: moment(l.time).day(),\n };\n }\n\n if (l.location?.lat && l.location?.lng) {\n const h3Index = latLngToCell(l.location.lat, l.location.lng, 8);\n return {\n ...l,\n location: h3Index,\n };\n }\n\n return l;\n });\n\n const cacheKey = `${key}_${JSON.stringify(newLabels)}`;\n return cacheKey;\n }\n}\n\nexport default SettingsManager;\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -1,70 +1,87 @@
1
- import Network from '@autofleet/network';
2
- import { LoggerInstanceManager } from '@autofleet/logger';
3
- import NodeCache from 'node-cache';
1
+ import Network from "@autofleet/network";
2
+ import { LoggerInstanceManager } from "@autofleet/logger";
3
+ import NodeCache from "node-cache";
4
4
 
5
+ //#region src/index.d.ts
5
6
  interface SettingsClassOptions {
6
- serviceUrl?: string;
7
- ttl?: number;
8
- disableTestEnvCheck?: boolean;
9
- logger?: LoggerInstanceManager;
7
+ serviceUrl?: string;
8
+ ttl?: number;
9
+ disableTestEnvCheck?: boolean;
10
+ logger?: LoggerInstanceManager;
10
11
  }
12
+ // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
11
13
  type SettingValue = string | boolean | number | any[] | any;
12
14
  interface Location {
13
- lat: number;
14
- lng: number;
15
+ lat: number;
16
+ lng: number;
15
17
  }
16
18
  interface Label {
17
- businessModelId?: string;
18
- demandSourceId?: string;
19
- fleetId?: string;
20
- vendorId?: string;
21
- time?: string | Date;
22
- location?: Location;
23
- contextId?: string;
19
+ businessModelId?: string;
20
+ demandSourceId?: string;
21
+ fleetId?: string;
22
+ vendorId?: string;
23
+ time?: string | Date;
24
+ location?: Location;
25
+ contextId?: string;
24
26
  }
25
27
  interface Entities {
26
- businessModelIds?: string[];
27
- fleetIds?: string[];
28
- demandSourceIds?: string[];
29
- contextIds?: string[];
28
+ businessModelIds?: string[];
29
+ fleetIds?: string[];
30
+ demandSourceIds?: string[];
31
+ contextIds?: string[];
30
32
  }
31
33
  declare const ENTITY_ID_NAMES: readonly ["businessModelId", "fleetId", "demandSourceId", "contextId"];
32
34
  type ValueByEntity = {
33
- key: string;
34
- value: SettingValue;
35
+ key: string;
36
+ value: SettingValue;
35
37
  } & Partial<Record<(typeof ENTITY_ID_NAMES)[number], string>>;
36
38
  interface GetSettingOption {
37
- timeout?: number;
38
- rejectOnFail?: boolean;
39
- }
40
- declare class CannotGetNetworkValueError extends Error {
39
+ timeout?: number;
40
+ rejectOnFail?: boolean;
41
41
  }
42
+ declare class CannotGetNetworkValueError extends Error {}
42
43
  declare class SettingsManager {
43
- #private;
44
- readonly ttl: number;
45
- readonly settingsCache: NodeCache;
46
- private readonly networkEvents;
47
- readonly network: Network;
48
- static readonly NEVER_DEFAULT_VALUE = "NEVER_DEFAULT_VALUE";
49
- readonly NEVER_DEFAULT_VALUE: SettingValue;
50
- readonly disableTestEnvCheck: boolean;
51
- static readNetworkValue(networkValue: SettingValue, defaultValue: SettingValue, key: string, logger: LoggerInstanceManager): SettingValue;
52
- constructor({ serviceUrl, ttl, disableTestEnvCheck, logger, }?: SettingsClassOptions);
53
- get(key: SettingValue, defaultValue?: SettingValue, labels?: Label[], { timeout, rejectOnFail }?: GetSettingOption): Promise<SettingValue>;
54
- getMultiple(settingsToGet: {
55
- key: string;
56
- defaultValue: SettingValue;
57
- }[], labels: Label[], { timeout, rejectOnFail }?: GetSettingOption): Promise<SettingValue[]>;
58
- getSettingsForMultipleEntities(settingsToGet: {
59
- key: string;
60
- defaultValue?: SettingValue;
61
- }[], entities: Entities, { timeout, skipCache }?: {
62
- timeout?: number;
63
- skipCache?: boolean;
64
- }): Promise<ValueByEntity[]>;
65
- setLocal(key: string, labels: Label[], value: SettingValue): void;
66
- flush(): void;
67
- getCacheKey(key: SettingValue, labels: Label[]): string;
44
+ #private;
45
+ readonly ttl: number;
46
+ readonly settingsCache: NodeCache;
47
+ private readonly networkEvents;
48
+ readonly network: Network;
49
+ readonly NEVER_DEFAULT_VALUE: typeof SettingsManager.NEVER_DEFAULT_VALUE;
50
+ readonly disableTestEnvCheck: boolean;
51
+ // eslint-disable-next-line @typescript-eslint/class-literal-property-style
52
+ static get NEVER_DEFAULT_VALUE(): "NEVER_DEFAULT_VALUE";
53
+ static readNetworkValue(networkValue: SettingValue, defaultValue: SettingValue, key: string, logger: LoggerInstanceManager): SettingValue;
54
+ constructor({
55
+ serviceUrl,
56
+ ttl,
57
+ disableTestEnvCheck,
58
+ logger
59
+ }?: SettingsClassOptions);
60
+ get(key: SettingValue, defaultValue?: SettingValue, labels?: Label[], {
61
+ timeout,
62
+ rejectOnFail
63
+ }?: GetSettingOption): Promise<SettingValue>;
64
+ getMultiple(settingsToGet: {
65
+ key: string;
66
+ defaultValue: SettingValue;
67
+ }[], labels: Label[], {
68
+ timeout,
69
+ rejectOnFail
70
+ }?: GetSettingOption): Promise<SettingValue[]>;
71
+ getSettingsForMultipleEntities(settingsToGet: {
72
+ key: string;
73
+ defaultValue?: SettingValue;
74
+ }[], entities: Entities, {
75
+ timeout,
76
+ skipCache
77
+ }?: {
78
+ timeout?: number;
79
+ skipCache?: boolean;
80
+ }): Promise<ValueByEntity[]>;
81
+ setLocal(key: string, labels: Label[], value: SettingValue): void;
82
+ flush(): void;
83
+ getCacheKey(key: SettingValue, labels: Label[]): string;
68
84
  }
69
-
70
- export { CannotGetNetworkValueError, type Entities, type Label, type ValueByEntity, SettingsManager as default };
85
+ //#endregion
86
+ export { CannotGetNetworkValueError, Entities, Label, ValueByEntity, SettingsManager as default };
87
+ //# sourceMappingURL=index.d.cts.map
package/dist/index.d.ts CHANGED
@@ -1,70 +1,87 @@
1
- import Network from '@autofleet/network';
2
- import { LoggerInstanceManager } from '@autofleet/logger';
3
- import NodeCache from 'node-cache';
1
+ import Network from "@autofleet/network";
2
+ import { LoggerInstanceManager } from "@autofleet/logger";
3
+ import NodeCache from "node-cache";
4
4
 
5
+ //#region src/index.d.ts
5
6
  interface SettingsClassOptions {
6
- serviceUrl?: string;
7
- ttl?: number;
8
- disableTestEnvCheck?: boolean;
9
- logger?: LoggerInstanceManager;
7
+ serviceUrl?: string;
8
+ ttl?: number;
9
+ disableTestEnvCheck?: boolean;
10
+ logger?: LoggerInstanceManager;
10
11
  }
12
+ // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
11
13
  type SettingValue = string | boolean | number | any[] | any;
12
14
  interface Location {
13
- lat: number;
14
- lng: number;
15
+ lat: number;
16
+ lng: number;
15
17
  }
16
18
  interface Label {
17
- businessModelId?: string;
18
- demandSourceId?: string;
19
- fleetId?: string;
20
- vendorId?: string;
21
- time?: string | Date;
22
- location?: Location;
23
- contextId?: string;
19
+ businessModelId?: string;
20
+ demandSourceId?: string;
21
+ fleetId?: string;
22
+ vendorId?: string;
23
+ time?: string | Date;
24
+ location?: Location;
25
+ contextId?: string;
24
26
  }
25
27
  interface Entities {
26
- businessModelIds?: string[];
27
- fleetIds?: string[];
28
- demandSourceIds?: string[];
29
- contextIds?: string[];
28
+ businessModelIds?: string[];
29
+ fleetIds?: string[];
30
+ demandSourceIds?: string[];
31
+ contextIds?: string[];
30
32
  }
31
33
  declare const ENTITY_ID_NAMES: readonly ["businessModelId", "fleetId", "demandSourceId", "contextId"];
32
34
  type ValueByEntity = {
33
- key: string;
34
- value: SettingValue;
35
+ key: string;
36
+ value: SettingValue;
35
37
  } & Partial<Record<(typeof ENTITY_ID_NAMES)[number], string>>;
36
38
  interface GetSettingOption {
37
- timeout?: number;
38
- rejectOnFail?: boolean;
39
- }
40
- declare class CannotGetNetworkValueError extends Error {
39
+ timeout?: number;
40
+ rejectOnFail?: boolean;
41
41
  }
42
+ declare class CannotGetNetworkValueError extends Error {}
42
43
  declare class SettingsManager {
43
- #private;
44
- readonly ttl: number;
45
- readonly settingsCache: NodeCache;
46
- private readonly networkEvents;
47
- readonly network: Network;
48
- static readonly NEVER_DEFAULT_VALUE = "NEVER_DEFAULT_VALUE";
49
- readonly NEVER_DEFAULT_VALUE: SettingValue;
50
- readonly disableTestEnvCheck: boolean;
51
- static readNetworkValue(networkValue: SettingValue, defaultValue: SettingValue, key: string, logger: LoggerInstanceManager): SettingValue;
52
- constructor({ serviceUrl, ttl, disableTestEnvCheck, logger, }?: SettingsClassOptions);
53
- get(key: SettingValue, defaultValue?: SettingValue, labels?: Label[], { timeout, rejectOnFail }?: GetSettingOption): Promise<SettingValue>;
54
- getMultiple(settingsToGet: {
55
- key: string;
56
- defaultValue: SettingValue;
57
- }[], labels: Label[], { timeout, rejectOnFail }?: GetSettingOption): Promise<SettingValue[]>;
58
- getSettingsForMultipleEntities(settingsToGet: {
59
- key: string;
60
- defaultValue?: SettingValue;
61
- }[], entities: Entities, { timeout, skipCache }?: {
62
- timeout?: number;
63
- skipCache?: boolean;
64
- }): Promise<ValueByEntity[]>;
65
- setLocal(key: string, labels: Label[], value: SettingValue): void;
66
- flush(): void;
67
- getCacheKey(key: SettingValue, labels: Label[]): string;
44
+ #private;
45
+ readonly ttl: number;
46
+ readonly settingsCache: NodeCache;
47
+ private readonly networkEvents;
48
+ readonly network: Network;
49
+ readonly NEVER_DEFAULT_VALUE: typeof SettingsManager.NEVER_DEFAULT_VALUE;
50
+ readonly disableTestEnvCheck: boolean;
51
+ // eslint-disable-next-line @typescript-eslint/class-literal-property-style
52
+ static get NEVER_DEFAULT_VALUE(): "NEVER_DEFAULT_VALUE";
53
+ static readNetworkValue(networkValue: SettingValue, defaultValue: SettingValue, key: string, logger: LoggerInstanceManager): SettingValue;
54
+ constructor({
55
+ serviceUrl,
56
+ ttl,
57
+ disableTestEnvCheck,
58
+ logger
59
+ }?: SettingsClassOptions);
60
+ get(key: SettingValue, defaultValue?: SettingValue, labels?: Label[], {
61
+ timeout,
62
+ rejectOnFail
63
+ }?: GetSettingOption): Promise<SettingValue>;
64
+ getMultiple(settingsToGet: {
65
+ key: string;
66
+ defaultValue: SettingValue;
67
+ }[], labels: Label[], {
68
+ timeout,
69
+ rejectOnFail
70
+ }?: GetSettingOption): Promise<SettingValue[]>;
71
+ getSettingsForMultipleEntities(settingsToGet: {
72
+ key: string;
73
+ defaultValue?: SettingValue;
74
+ }[], entities: Entities, {
75
+ timeout,
76
+ skipCache
77
+ }?: {
78
+ timeout?: number;
79
+ skipCache?: boolean;
80
+ }): Promise<ValueByEntity[]>;
81
+ setLocal(key: string, labels: Label[], value: SettingValue): void;
82
+ flush(): void;
83
+ getCacheKey(key: SettingValue, labels: Label[]): string;
68
84
  }
69
-
70
- export { CannotGetNetworkValueError, type Entities, type Label, type ValueByEntity, SettingsManager as default };
85
+ //#endregion
86
+ export { CannotGetNetworkValueError, Entities, Label, ValueByEntity, SettingsManager as default };
87
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,3 +1,2 @@
1
- import U from'@autofleet/network';import M from'@autofleet/logger';import O from'node-cache';import b,{once}from'node:events';import I from'moment';import {latLngToCell}from'h3-js';var R=Object.defineProperty;var p=(E,r)=>R(E,"name",{value:r,configurable:true});var F=60*5,C="waitingToNetwork",x=p(E=>E||(process.env.SETTING_MS_SERVICE_HOST?`http://${process.env.SETTING_MS_SERVICE_HOST}/`:void 0)||(process.env.NODE_ENV!=="test"?"http://setting-ms.autofleet.io/":"http://localhost:9999/"),"findUrl");function _(E){return E!==C&&typeof E=="object"&&"value"in E}p(_,"isCacheEntry");function $(E){return Object.entries(E).map(([r,o])=>[r.slice(0,r.length-1),Array.from(new Set(o))]).flatMap(([r,o])=>o.map(f=>({[r]:f})))}p($,"convertEntitiesToLabels");var z=["businessModelId","fleetId","demandSourceId","contextId"],K=class extends Error{static{p(this,"CannotGetNetworkValueError");}},H=class N{static{p(this,"SettingsManager");}ttl;settingsCache=new O;networkEvents=new b;network;static NEVER_DEFAULT_VALUE="NEVER_DEFAULT_VALUE";NEVER_DEFAULT_VALUE=N.NEVER_DEFAULT_VALUE;disableTestEnvCheck;#t;static readNetworkValue(r,o,f,d){let e=r;if(typeof r>"u"&&(e=o,d.info("Setting falling back to default as network value was defined",{key:f,defaultValue:o})),e===N.NEVER_DEFAULT_VALUE)throw new Error("Cannot find value from network or cache, default value is set to never");return e}constructor({serviceUrl:r,ttl:o=F,disableTestEnvCheck:f=false,logger:d=M()}={}){let e=x(r);this.#t=d,this.ttl=o,this.disableTestEnvCheck=f,this.network=new U({serviceUrl:e,logger:d});}async get(r,o,f=[],{timeout:d=5e3,rejectOnFail:e=false}={}){if(typeof o>"u")throw new Error("Can't get a key without defaultValue");let h=this.getCacheKey(r,f),l=this.settingsCache.get(h);if(l!==void 0){if(this.#t.debug("setting found in cache",{cacheKey:h}),C===l){let[c]=await once(this.networkEvents,h);if(c instanceof Error&&e)throw c;return N.readNetworkValue(c,o,r,this.#t)}return _(l)?l.value:l}if(!this.disableTestEnvCheck&&process.env.NODE_ENV==="test")return this.#t.info("returning default value setting in TEST mode",{cacheKey:h}),o;let g;try{this.settingsCache.set(h,C,this.ttl),g=(await this.network.get(`/api/v1/settings/get-setting/${r}`,{params:{labels:f.map(t=>JSON.stringify(t))},timeout:d})).data.value;}catch(c){if(this.#t.error("Cant get setting from network",{error:c,rejectOnFail:e,key:r}),e){let t=new K;throw this.networkEvents.emit(h,t),t}}this.networkEvents.emit(h,g);let s;try{s=N.readNetworkValue(g,o,r,this.#t);}catch(c){throw this.settingsCache.del(h),c}return this.settingsCache.set(h,{value:s},this.ttl),s}async getMultiple(r,o,{timeout:f=5e3,rejectOnFail:d=false}={}){let e=new Map,h=new Map,l=new Set,g=new Set;if(r.forEach(s=>{let c=this.getCacheKey(s.key,o);e.set(s.key,c);let t=this.settingsCache.get(c);if(t===void 0){l.add(s.key);return}if(t===C){g.add(s.key);return}h.set(s.key,_(t)?t.value:t);}),process.env.NODE_ENV==="test")return r.map(s=>h.get(s.key)??s.defaultValue);if(g.size){let s=Array.from(g);(await Promise.all(s.map(t=>once(this.networkEvents,e.get(t))))).forEach(([t])=>{if(t instanceof Error&&d)throw t;h.set(s.shift(),t);});}if(l.size){let s=Array.from(l);try{s.forEach(t=>this.settingsCache.set(e.get(t),C,this.ttl));let{data:c}=await this.network.post("/api/v1/settings/get-settings/_multiple",{keys:s,labels:o,skipEntityQueryAddition:!0},{timeout:f});s.forEach((t,w)=>{let{value:V}=c[w];h.set(t,V),this.networkEvents.emit(e.get(t),V);});}catch(c){if(this.#t.error("Cant get setting from network",{err:c,settingsToFetch:l,labels:o}),d){let t=new K;throw l.forEach(w=>this.networkEvents.emit(e.get(w),t)),t}}}return r.map(s=>{let c=e.get(s.key),t;try{t=N.readNetworkValue(h.get(s.key),s.defaultValue,s.key,this.#t);}catch(w){throw this.settingsCache.del(c),w}return l.has(s.key)&&this.settingsCache.set(c,{value:t},this.ttl),t})}async getSettingsForMultipleEntities(r,o,{timeout:f=5e3,skipCache:d}={}){let e=r.map(a=>a.key),h=$(o),l=e.flatMap(a=>h.map(i=>[a,i])),g=[],s=[],c=[],t=p((a,i)=>{let u=l.findIndex(([n,y])=>{if(n!==a)return false;let[k,m]=Object.entries(y)[0],[T,v]=Object.entries(i)[0];return k===T&&m===v});u>=0&&l.splice(u,1);},"removeFromSearchList"),w=p(({key:a,label:i,value:u})=>{t(a,i),c.push({key:a,...i,value:u});},"pushToResult"),V=p(({value:a,key:i})=>typeof a<"u"?a:r.find(u=>u.key===i)?.defaultValue,"getValueOrDefault");if(d)g.push(...l);else for(let[a,i]of l){let u=this.getCacheKey(a,[i]),n=this.settingsCache.get(u);n===void 0?g.push([a,i]):n===C?s.push([a,i]):w({key:a,value:_(n)?n.value:n,label:i});}if(s.length){let a=await Promise.all(s.map(async([i,u])=>({values:await once(this.networkEvents,this.getCacheKey(i,[u])),key:i,label:u})));for(let{values:[i],key:u,label:n}of a){if(i instanceof Error)throw i;w({key:u,value:i,label:n});}}if(g.length){for(let[n,y]of g)this.settingsCache.set(this.getCacheKey(n,[y]),C,this.ttl);let a=g.reduce((n,[y,k])=>{n.keys.push(y);let[m,T]=Object.entries(k)[0],v=m+"s";return n.entities[v]??=[],n.entities[v].push(T),n},{keys:[],entities:{}}),i;try{i=(await this.network.post("/api/v1/settings/get-settings/_multiple-entities",{...a,skipCache:d},{timeout:f})).data;}catch(n){this.#t.error("Failed to get multiple setting from network",{err:n,toFetch:g});let y=new K;for(let[k,m]of g)this.networkEvents.emit(this.getCacheKey(k,[m]),y);throw y}finally{for(let[n,y]of g)this.settingsCache.del(this.getCacheKey(n,[y]));}let u=Array.isArray(i)?i:[];for(let n of u)for(let y of z){let k=n[y];if(k){let m=V(n),{key:T}=n,v={[y]:k};w({key:T,value:m,label:v});let A=this.getCacheKey(T,[v]);this.settingsCache.set(A,{value:m},this.ttl),this.networkEvents.emit(A,m);}}}let L=l.reduce((a,[i,u])=>{let n=V({value:void 0,key:i});return n&&a.push({key:i,value:n,...u}),a},[]);return [...c,...L]}setLocal(r,o,f){let d=this.getCacheKey(r,o);this.settingsCache.set(d,{value:f},this.ttl);}flush(){return this.settingsCache.flushAll()}getCacheKey(r,o){let f=o.map(e=>{if(e.time)return {...e,time:I(e.time).startOf("hour").format(),day:I(e.time).day()};if(e.location?.lat&&e.location?.lng){let h=latLngToCell(e.location.lat,e.location.lng,8);return {...e,location:h}}return e});return `${r}_${JSON.stringify(f)}`}},X=H;
2
- export{K as CannotGetNetworkValueError,X as default};//# sourceMappingURL=index.js.map
1
+ import e from"@autofleet/network";import t from"@autofleet/logger";import n from"node-cache";import r,{once as i}from"node:events";import a from"moment";import{latLngToCell as o}from"h3-js";const s=60*5,c=`waitingToNetwork`,l=e=>e||(process.env.SETTING_MS_SERVICE_HOST?`http://${process.env.SETTING_MS_SERVICE_HOST}/`:void 0)||(process.env.NODE_ENV===`test`?`http://localhost:9999/`:`http://setting-ms.autofleet.io/`);function u(e){return Object.entries(e).map(([e,t])=>{let n=e.slice(0,e.length-1);return[n,Array.from(new Set(t))]}).flatMap(([e,t])=>t.map(t=>({[e]:t})))}const d=[`businessModelId`,`fleetId`,`demandSourceId`,`contextId`];var f=class extends Error{},p=class p{ttl;settingsCache=new n;networkEvents=new r;network;NEVER_DEFAULT_VALUE=p.NEVER_DEFAULT_VALUE;disableTestEnvCheck;#logger;static get NEVER_DEFAULT_VALUE(){return`NEVER_DEFAULT_VALUE`}static readNetworkValue(e,t,n,r){let i=e;if(e===void 0&&(i=t,r.info(`Setting falling back to default as network value was defined`,{key:n,defaultValue:t})),i===p.NEVER_DEFAULT_VALUE)throw Error(`Cannot find value from network or cache, default value is set to never`);return i}constructor({serviceUrl:n,ttl:r=s,disableTestEnvCheck:i=!1,logger:a=t()}={}){let o=l(n);this.#logger=a,this.ttl=r,this.disableTestEnvCheck=i,this.network=new e({serviceUrl:o,logger:a})}async get(e,t,n=[],{timeout:r=5e3,rejectOnFail:a=!1}={}){if(t===void 0)throw Error(`Can't get a key without defaultValue`);let o=this.getCacheKey(e,n),s=this.settingsCache.get(o);if(s!==void 0){if(this.#logger.debug(`setting found in cache`,{cacheKey:o}),c===s){let[n]=await i(this.networkEvents,o);if(n instanceof Error&&a)throw n;return p.readNetworkValue(n,t,e,this.#logger)}return s}if(!this.disableTestEnvCheck&&process.env.NODE_ENV===`test`)return this.#logger.info(`returning default value setting in TEST mode`,{cacheKey:o}),t;let l;try{this.settingsCache.set(o,c,this.ttl);let t=await this.network.get(`/api/v1/settings/get-setting/${e}`,{params:{labels:n.map(e=>JSON.stringify(e))},timeout:r});l=t.data.value}catch(t){if(this.#logger.error(`Cant get setting from network`,{error:t,rejectOnFail:a,key:e}),a){let e=new f;throw this.networkEvents.emit(o,e),e}}this.networkEvents.emit(o,l);let u;try{u=p.readNetworkValue(l,t,e,this.#logger)}catch(e){throw this.settingsCache.del(o),e}return this.settingsCache.set(o,u,this.ttl),u}async getMultiple(e,t,{timeout:n=5e3,rejectOnFail:r=!1}={}){let a=new Map,o=new Map,s=new Set,l=new Set;if(e.forEach(e=>{let n=this.getCacheKey(e.key,t);a.set(e.key,n);let r=this.settingsCache.get(n);if(r===void 0){s.add(e.key);return}if(r===c){l.add(e.key);return}o.set(e.key,r)}),process.env.NODE_ENV===`test`)return e.map(e=>o.get(e.key)??e.defaultValue);if(l.size){let e=Array.from(l),t=await Promise.all(e.map(e=>i(this.networkEvents,a.get(e))));t.forEach(([t])=>{if(t instanceof Error&&r)throw t;o.set(e.shift(),t)})}if(s.size){let e=Array.from(s);try{e.forEach(e=>this.settingsCache.set(a.get(e),c,this.ttl));let{data:r}=await this.network.post(`/api/v1/settings/get-settings/_multiple`,{keys:e,labels:t,skipEntityQueryAddition:!0},{timeout:n});e.forEach((e,t)=>{let{value:n}=r[t];o.set(e,n),this.networkEvents.emit(a.get(e),n)})}catch(e){if(this.#logger.error(`Cant get setting from network`,{err:e,settingsToFetch:s,labels:t}),r){let e=new f;throw s.forEach(t=>this.networkEvents.emit(a.get(t),e)),e}}}return e.map(e=>{let t=a.get(e.key),n;try{n=p.readNetworkValue(o.get(e.key),e.defaultValue,e.key,this.#logger)}catch(e){throw this.settingsCache.del(t),e}return s.has(e.key)&&this.settingsCache.set(t,n,this.ttl),n})}async getSettingsForMultipleEntities(e,t,{timeout:n=5e3,skipCache:r}={}){let a=e.map(e=>e.key),o=u(t),s=a.flatMap(e=>o.map(t=>[e,t])),l=[],p=[],m=[],h=(e,t)=>{let n=s.findIndex(([n,r])=>{if(n!==e)return!1;let[i,a]=Object.entries(r)[0],[o,s]=Object.entries(t)[0];return i===o&&a===s});n>=0&&s.splice(n,1)},g=({key:e,label:t,value:n})=>{h(e,t),m.push({key:e,...t,value:n})},_=({value:t,key:n})=>t===void 0?e.find(e=>e.key===n)?.defaultValue:t;if(r)l.push(...s);else for(let[e,t]of s){let n=this.getCacheKey(e,[t]),r=this.settingsCache.get(n);r===void 0?l.push([e,t]):r===c?p.push([e,t]):g({key:e,value:r,label:t})}if(p.length){let e=await Promise.all(p.map(async([e,t])=>{let n=await i(this.networkEvents,this.getCacheKey(e,[t]));return{values:n,key:e,label:t}}));for(let{values:[t],key:n,label:r}of e){if(t instanceof Error)throw t;g({key:n,value:t,label:r})}}if(l.length){for(let[e,t]of l)this.settingsCache.set(this.getCacheKey(e,[t]),c,this.ttl);let e=l.reduce((e,[t,n])=>{e.keys.push(t);let[r,i]=Object.entries(n)[0],a=r+`s`;return e.entities[a]??=[],e.entities[a].push(i),e},{keys:[],entities:{}}),t;try{let i=await this.network.post(`/api/v1/settings/get-settings/_multiple-entities`,{...e,skipCache:r},{timeout:n});t=i.data}catch(e){this.#logger.error(`Failed to get multiple setting from network`,{err:e,toFetch:l});let t=new f;for(let[e,n]of l)this.networkEvents.emit(this.getCacheKey(e,[n]),t);throw t}finally{for(let[e,t]of l)this.settingsCache.del(this.getCacheKey(e,[t]))}let i=Array.isArray(t)?t:[];for(let e of i)for(let t of d){let n=e[t];if(n){let r=_(e),{key:i}=e,a={[t]:n};g({key:i,value:r,label:a});let o=this.getCacheKey(i,[a]);this.settingsCache.set(o,r,this.ttl),this.networkEvents.emit(o,r)}}}let v=s.reduce((e,[t,n])=>{let r=_({value:void 0,key:t});return r&&e.push({key:t,value:r,...n}),e},[]);return[...m,...v]}setLocal(e,t,n){let r=this.getCacheKey(e,t);this.settingsCache.set(r,n,this.ttl)}flush(){return this.settingsCache.flushAll()}getCacheKey(e,t){let n=t.map(e=>{if(e.time)return{...e,time:a(e.time).startOf(`hour`).format(),day:a(e.time).day()};if(e.location?.lat&&e.location?.lng){let t=o(e.location.lat,e.location.lng,8);return{...e,location:t}}return e}),r=`${e}_${JSON.stringify(n)}`;return r}},m=p;export{f as CannotGetNetworkValueError,m as default};
3
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["FIVE_MINUTES","WAITING_TO_NETWORK","findUrl","__name","serviceUrl","process","env","SETTING_MS_SERVICE_HOST","undefined","NODE_ENV","isCacheEntry","value","convertEntitiesToLabels","entities","Object","entries","map","entity","ids","slice","length","Array","from","Set","flatMap","id","ENTITY_ID_NAMES","CannotGetNetworkValueError","Error","SettingsManager","ttl","settingsCache","NodeCache","networkEvents","EventEmitter","network","NEVER_DEFAULT_VALUE","disableTestEnvCheck","#logger","readNetworkValue","networkValue","defaultValue","key","logger","returnValue","info","constructor","Logger","localServiceUrl","Network","get","labels","timeout","rejectOnFail","cacheKey","getCacheKey","cacheValue","debug","once","set","params","label","JSON","stringify","data","error","errorToThrow","emit","e","del","getMultiple","settingsToGet","cacheKeyCache","Map","settingsToReturn","settingsToFetch","cachedSettingsToAwait","forEach","obj","add","size","keys","Promise","all","shift","values","post","skipEntityQueryAddition","index","err","setting","has","getSettingsForMultipleEntities","skipCache","s","searchList","toFetch","waitingToNetwork","result","removeFromSearchList","findIndex","itemKey","itemLabel","itemEntityKey","itemEntityId","entityKey","entityId","splice","pushToResult","push","getValueOrDefault","find","networkResults","toFetchReduced","reduce","acc","entitiesKey","settingsArr","isArray","defaults","setLocal","flush","flushAll","newLabels","l","time","moment","startOf","format","day","location","lat","lng","h3Index","latLngToCell","index_default"],"mappings":"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","file":"index.js","sourcesContent":["import Network from '@autofleet/network';\nimport Logger, { type LoggerInstanceManager } from '@autofleet/logger';\nimport NodeCache from 'node-cache';\nimport EventEmitter, { once } from 'node:events';\nimport moment from 'moment';\nimport { latLngToCell } from 'h3-js';\n\nconst FIVE_MINUTES = 60 * 5;\n\nconst WAITING_TO_NETWORK = 'waitingToNetwork';\ntype WaitingToNetwork = typeof WAITING_TO_NETWORK;\n\nconst findUrl = (serviceUrl?: string) => serviceUrl\n || (process.env.SETTING_MS_SERVICE_HOST ? `http://${process.env.SETTING_MS_SERVICE_HOST}/` : undefined)\n /* c8 ignore next */\n || (process.env.NODE_ENV !== 'test' ? 'http://setting-ms.autofleet.io/' : 'http://localhost:9999/');\n\ninterface SettingsClassOptions {\n serviceUrl?: string;\n ttl?: number;\n disableTestEnvCheck?: boolean;\n logger?: LoggerInstanceManager;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\ntype SettingValue = string | boolean | number | any[] | any;\n\ninterface CacheEntry {\n value: SettingValue;\n}\n\ntype CacheValue = CacheEntry | WaitingToNetwork;\n\nfunction isCacheEntry(value: CacheValue): value is CacheEntry {\n return value !== WAITING_TO_NETWORK && typeof value === 'object' && 'value' in value;\n}\n\ninterface Location {\n lat: number;\n lng: number;\n}\nexport interface Label {\n businessModelId?: string;\n demandSourceId?: string;\n fleetId?: string;\n vendorId?: string;\n time?: string | Date;\n location?: Location;\n contextId?: string;\n}\n\nexport interface Entities {\n businessModelIds?: string[];\n fleetIds?: string[];\n demandSourceIds?: string[];\n contextIds?: string[];\n}\n\nfunction convertEntitiesToLabels(entities: Entities): Label[] {\n return Object.entries(entities)\n .map<[string, string[]]>(([entity, ids]) => {\n // change to singular, example: 'fleetIds' -> 'fleetId'\n const singularEntity = entity.slice(0, entity.length - 1);\n // make sure ids are unique\n return [singularEntity, Array.from(new Set(ids))];\n })\n .flatMap<Label>(([entity, ids]) => ids.map(id => ({ [entity]: id })));\n}\n\nconst ENTITY_ID_NAMES = [\n 'businessModelId',\n 'fleetId',\n 'demandSourceId',\n 'contextId',\n] as const;\n\nexport type ValueByEntity = {\n key: string;\n value: SettingValue;\n} & Partial<Record<(typeof ENTITY_ID_NAMES)[number], string>>;\n\ninterface GetSettingOption {\n timeout?: number;\n rejectOnFail?: boolean;\n}\n\nexport class CannotGetNetworkValueError extends Error {}\n\nclass SettingsManager {\n readonly ttl: number;\n\n readonly settingsCache: NodeCache = new NodeCache();\n\n private readonly networkEvents = new EventEmitter();\n\n readonly network: Network;\n\n static readonly NEVER_DEFAULT_VALUE = 'NEVER_DEFAULT_VALUE';\n\n readonly NEVER_DEFAULT_VALUE: SettingValue = SettingsManager.NEVER_DEFAULT_VALUE;\n\n readonly disableTestEnvCheck: boolean;\n\n readonly #logger: LoggerInstanceManager;\n\n static readNetworkValue(networkValue: SettingValue, defaultValue: SettingValue, key: string, logger: LoggerInstanceManager): SettingValue {\n let returnValue = networkValue;\n if (typeof networkValue === 'undefined') {\n returnValue = defaultValue;\n logger.info('Setting falling back to default as network value was defined', { key, defaultValue });\n }\n\n if (returnValue === SettingsManager.NEVER_DEFAULT_VALUE) {\n throw new Error('Cannot find value from network or cache, default value is set to never');\n }\n\n return returnValue;\n }\n\n constructor({\n serviceUrl, ttl = FIVE_MINUTES, disableTestEnvCheck = false, logger = Logger(),\n }: SettingsClassOptions = {}) {\n const localServiceUrl = findUrl(serviceUrl);\n\n this.#logger = logger;\n this.ttl = ttl;\n this.disableTestEnvCheck = disableTestEnvCheck;\n this.network = new Network({\n serviceUrl: localServiceUrl, logger,\n });\n }\n\n async get(\n key: SettingValue,\n defaultValue?: SettingValue,\n labels: Label[] = [],\n { timeout = 5000, rejectOnFail = false }: GetSettingOption = {},\n ): Promise<SettingValue> {\n if (typeof defaultValue === 'undefined') {\n throw new Error('Can\\'t get a key without defaultValue');\n }\n\n const cacheKey = this.getCacheKey(key, labels);\n const cacheValue = this.settingsCache.get<CacheValue>(cacheKey);\n if (cacheValue !== undefined) {\n this.#logger.debug('setting found in cache', { cacheKey });\n if (WAITING_TO_NETWORK === cacheValue) {\n const [networkValue] = await once(this.networkEvents, cacheKey);\n if (networkValue instanceof Error && rejectOnFail) {\n throw networkValue;\n }\n return SettingsManager.readNetworkValue(networkValue, defaultValue, key, this.#logger);\n }\n return isCacheEntry(cacheValue) ? cacheValue.value : cacheValue;\n }\n\n if (!this.disableTestEnvCheck && process.env.NODE_ENV === 'test') {\n this.#logger.info('returning default value setting in TEST mode', { cacheKey });\n return defaultValue;\n }\n\n let networkValue;\n try {\n this.settingsCache.set(cacheKey, WAITING_TO_NETWORK, this.ttl);\n const networkResponse = await this.network.get(`/api/v1/settings/get-setting/${key}`, {\n params: {\n labels: labels.map(label => JSON.stringify(label)),\n },\n timeout,\n });\n networkValue = networkResponse.data.value;\n } catch (error) {\n this.#logger.error('Cant get setting from network', { error, rejectOnFail, key });\n if (rejectOnFail) {\n const errorToThrow = new CannotGetNetworkValueError();\n this.networkEvents.emit(cacheKey, errorToThrow);\n throw errorToThrow;\n }\n }\n\n this.networkEvents.emit(cacheKey, networkValue);\n let returnValue;\n try {\n returnValue = SettingsManager.readNetworkValue(networkValue, defaultValue, key, this.#logger);\n } catch (e) {\n this.settingsCache.del(cacheKey);\n throw e;\n }\n this.settingsCache.set(cacheKey, { value: returnValue }, this.ttl);\n return returnValue;\n }\n\n async getMultiple(\n settingsToGet: { key: string; defaultValue: SettingValue; }[],\n labels: Label[],\n { timeout = 5000, rejectOnFail = false }: GetSettingOption = {},\n ): Promise<SettingValue[]> {\n const cacheKeyCache = new Map<string, string>();\n const settingsToReturn = new Map();\n const settingsToFetch = new Set<string>();\n const cachedSettingsToAwait = new Set<string>();\n\n settingsToGet.forEach((obj) => {\n const cacheKey = this.getCacheKey(obj.key, labels);\n cacheKeyCache.set(obj.key, cacheKey);\n const cacheValue = this.settingsCache.get<CacheValue>(cacheKey);\n if (cacheValue === undefined) {\n settingsToFetch.add(obj.key);\n return;\n }\n if (cacheValue === WAITING_TO_NETWORK) {\n cachedSettingsToAwait.add(obj.key);\n return;\n }\n settingsToReturn.set(obj.key, isCacheEntry(cacheValue) ? cacheValue.value : cacheValue);\n });\n\n if (process.env.NODE_ENV === 'test') {\n return settingsToGet.map(obj => settingsToReturn.get(obj.key) ?? obj.defaultValue);\n }\n\n if (cachedSettingsToAwait.size) {\n const keys = Array.from(cachedSettingsToAwait);\n const cached = await Promise.all(keys.map(key => once(this.networkEvents, cacheKeyCache.get(key)!)));\n cached.forEach(([networkValue]) => {\n if (networkValue instanceof Error && rejectOnFail) {\n throw networkValue;\n }\n settingsToReturn.set(keys.shift()!, networkValue);\n });\n }\n\n if (settingsToFetch.size) {\n const keys = Array.from(settingsToFetch);\n try {\n keys.forEach(key => this.settingsCache.set(cacheKeyCache.get(key)!, WAITING_TO_NETWORK, this.ttl));\n const { data: values } = await this.network.post<SettingValue[]>('/api/v1/settings/get-settings/_multiple', {\n keys,\n labels,\n skipEntityQueryAddition: true,\n }, {\n timeout,\n });\n\n keys.forEach((key, index) => {\n const { value } = values[index];\n settingsToReturn.set(key, value);\n this.networkEvents.emit(cacheKeyCache.get(key)!, value);\n });\n } catch (err) {\n this.#logger.error('Cant get setting from network', { err, settingsToFetch, labels });\n if (rejectOnFail) {\n const errorToThrow = new CannotGetNetworkValueError();\n settingsToFetch.forEach(key => this.networkEvents.emit(cacheKeyCache.get(key)!, errorToThrow));\n throw errorToThrow;\n }\n }\n }\n\n return settingsToGet.map((setting) => {\n const cacheKey = cacheKeyCache.get(setting.key)!;\n let returnValue;\n try {\n returnValue = SettingsManager.readNetworkValue(settingsToReturn.get(setting.key), setting.defaultValue, setting.key, this.#logger);\n } catch (err) {\n this.settingsCache.del(cacheKey);\n throw err;\n }\n if (settingsToFetch.has(setting.key)) {\n this.settingsCache.set(cacheKey, { value: returnValue }, this.ttl);\n }\n return returnValue;\n });\n }\n\n async getSettingsForMultipleEntities(\n settingsToGet: { key: string; defaultValue?: SettingValue; }[],\n entities: Entities,\n { timeout = 5000, skipCache }: { timeout?: number; skipCache?: boolean; } = {},\n ): Promise<ValueByEntity[]> {\n const keys = settingsToGet.map(s => s.key);\n\n const labels = convertEntitiesToLabels(entities);\n\n /** Cartesian product of `keys` & `labels` */\n const searchList = keys.flatMap(key => labels.map<[string, Label]>(label => ([key, label])));\n\n const toFetch: [string, Label][] = [];\n const waitingToNetwork: [string, Label][] = [];\n const result: ValueByEntity[] = [];\n\n const removeFromSearchList = (key: string, label: Label) => {\n const index = searchList.findIndex(([itemKey, itemLabel]) => {\n if (itemKey !== key) {\n return false;\n }\n const [itemEntityKey, itemEntityId] = Object.entries(itemLabel)[0];\n const [entityKey, entityId] = Object.entries(label)[0];\n return itemEntityKey === entityKey && itemEntityId === entityId;\n });\n if (index >= 0) {\n searchList.splice(index, 1);\n }\n };\n\n const pushToResult = ({ key, label, value }: { key: string; label: Label; value: SettingValue; }) => {\n removeFromSearchList(key, label);\n result.push({ key, ...label, value });\n };\n\n const getValueOrDefault = ({ value, key }: { value: unknown; key: string; }) => {\n if (typeof value !== 'undefined') {\n return value;\n }\n return settingsToGet.find(s => s.key === key)?.defaultValue;\n };\n\n if (skipCache) {\n toFetch.push(...searchList);\n } else {\n for (const [key, label] of searchList) {\n const cacheKey = this.getCacheKey(key, [label]);\n const cacheValue = this.settingsCache.get<CacheValue>(cacheKey);\n\n if (cacheValue === undefined) {\n toFetch.push([key, label]);\n } else if (cacheValue === WAITING_TO_NETWORK) {\n waitingToNetwork.push([key, label]);\n } else {\n pushToResult({ key, value: isCacheEntry(cacheValue) ? cacheValue.value : cacheValue, label });\n }\n }\n }\n\n if (waitingToNetwork.length) {\n const networkResults = await Promise.all(waitingToNetwork.map(async ([key, label]) => {\n const values = await once(this.networkEvents, this.getCacheKey(key, [label]));\n return { values, key, label };\n }));\n\n for (const { values: [networkValue], key, label } of networkResults) {\n if (networkValue instanceof Error) {\n throw networkValue;\n }\n pushToResult({ key, value: networkValue, label });\n }\n }\n\n if (toFetch.length) {\n for (const [key, label] of toFetch) {\n this.settingsCache.set(this.getCacheKey(key, [label]), WAITING_TO_NETWORK, this.ttl);\n }\n\n const toFetchReduced = toFetch.reduce<{ keys: string[]; entities: Entities; }>((acc, [key, label]) => {\n acc.keys.push(key);\n const [entityKey, entityId] = Object.entries(label)[0];\n const entitiesKey = entityKey + 's' as keyof Entities;\n acc.entities[entitiesKey] ??= [];\n acc.entities[entitiesKey].push(entityId);\n return acc;\n }, { keys: [], entities: {} });\n\n let data;\n try {\n const res = await this.network.post('/api/v1/settings/get-settings/_multiple-entities', { ...toFetchReduced, skipCache }, { timeout });\n data = res.data;\n } catch (err) {\n this.#logger.error('Failed to get multiple setting from network', { err, toFetch });\n const errorToThrow = new CannotGetNetworkValueError();\n for (const [key, label] of toFetch) {\n this.networkEvents.emit(this.getCacheKey(key, [label]), errorToThrow);\n }\n throw errorToThrow;\n } finally {\n // clean all WAITING_TO_NETWORK\n for (const [key, label] of toFetch) {\n this.settingsCache.del(this.getCacheKey(key, [label]));\n }\n }\n\n const settingsArr = Array.isArray(data) ? data : [];\n for (const setting of settingsArr) {\n for (const entity of ENTITY_ID_NAMES) {\n const entityId = setting[entity];\n if (entityId) {\n const value = getValueOrDefault(setting);\n const { key } = setting;\n const label = { [entity]: entityId };\n\n pushToResult({ key, value, label });\n\n const cacheKey = this.getCacheKey(key, [label]);\n this.settingsCache.set(cacheKey, { value }, this.ttl);\n this.networkEvents.emit(cacheKey, value);\n }\n }\n }\n }\n\n const defaults = searchList.reduce<ValueByEntity[]>((acc, [key, label]) => {\n const value = getValueOrDefault({ value: undefined, key });\n if (value) {\n acc.push({ key, value, ...label });\n }\n return acc;\n }, []);\n return [...result, ...defaults];\n }\n\n setLocal(key: string, labels: Label[], value: SettingValue): void {\n const cacheKey = this.getCacheKey(key, labels);\n this.settingsCache.set(cacheKey, { value }, this.ttl);\n }\n\n flush(): void {\n return this.settingsCache.flushAll();\n }\n\n getCacheKey(key: SettingValue, labels: Label[]): string {\n const newLabels = labels.map((l) => {\n if (l.time) {\n return {\n ...l,\n time: moment(l.time).startOf('hour').format(),\n day: moment(l.time).day(),\n };\n }\n\n if (l.location?.lat && l.location?.lng) {\n const h3Index = latLngToCell(l.location.lat, l.location.lng, 8);\n return {\n ...l,\n location: h3Index,\n };\n }\n\n return l;\n });\n\n const cacheKey = `${key}_${JSON.stringify(newLabels)}`;\n return cacheKey;\n }\n}\n\nexport default SettingsManager;\n"]}
1
+ {"version":3,"file":"index.js","names":["serviceUrl?: string","entities: Entities","#logger","networkValue: SettingValue","defaultValue: SettingValue","key: string","logger: LoggerInstanceManager","key: SettingValue","defaultValue?: SettingValue","labels: Label[]","networkValue","settingsToGet: { key: string; defaultValue: SettingValue; }[]","settingsToGet: { key: string; defaultValue?: SettingValue; }[]","toFetch: [string, Label][]","waitingToNetwork: [string, Label][]","result: ValueByEntity[]","label: Label","value: SettingValue"],"sources":["../src/index.ts"],"sourcesContent":["import Network from '@autofleet/network';\nimport Logger, { type LoggerInstanceManager } from '@autofleet/logger';\nimport NodeCache from 'node-cache';\nimport EventEmitter, { once } from 'node:events';\nimport moment from 'moment';\nimport { latLngToCell } from 'h3-js';\n\nconst FIVE_MINUTES = 60 * 5;\nconst WAITING_TO_NETWORK = 'waitingToNetwork';\n\nconst findUrl = (serviceUrl?: string) => serviceUrl\n || (process.env.SETTING_MS_SERVICE_HOST ? `http://${process.env.SETTING_MS_SERVICE_HOST}/` : undefined)\n /* c8 ignore next */\n || (process.env.NODE_ENV !== 'test' ? 'http://setting-ms.autofleet.io/' : 'http://localhost:9999/');\n\ninterface SettingsClassOptions {\n serviceUrl?: string;\n ttl?: number;\n disableTestEnvCheck?: boolean;\n logger?: LoggerInstanceManager;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\ntype SettingValue = string | boolean | number | any[] | any;\n\ninterface Location {\n lat: number;\n lng: number;\n}\nexport interface Label {\n businessModelId?: string;\n demandSourceId?: string;\n fleetId?: string;\n vendorId?: string;\n time?: string | Date;\n location?: Location;\n contextId?: string;\n}\n\nexport interface Entities {\n businessModelIds?: string[];\n fleetIds?: string[];\n demandSourceIds?: string[];\n contextIds?: string[];\n}\n\nfunction convertEntitiesToLabels(entities: Entities): Label[] {\n return Object.entries(entities)\n .map<[string, string[]]>(([entity, ids]) => {\n // change to singular, example: 'fleetIds' -> 'fleetId'\n const singularEntity = entity.slice(0, entity.length - 1);\n // make sure ids are unique\n return [singularEntity, Array.from(new Set(ids))];\n })\n .flatMap<Label>(([entity, ids]) => ids.map(id => ({ [entity]: id })));\n}\n\nconst ENTITY_ID_NAMES = [\n 'businessModelId',\n 'fleetId',\n 'demandSourceId',\n 'contextId',\n] as const;\n\nexport type ValueByEntity = {\n key: string;\n value: SettingValue;\n} & Partial<Record<(typeof ENTITY_ID_NAMES)[number], string>>;\n\ninterface GetSettingOption {\n timeout?: number;\n rejectOnFail?: boolean;\n}\n\nexport class CannotGetNetworkValueError extends Error {}\n\nclass SettingsManager {\n readonly ttl: number;\n\n readonly settingsCache: NodeCache = new NodeCache();\n\n private readonly networkEvents = new EventEmitter();\n\n readonly network: Network;\n\n readonly NEVER_DEFAULT_VALUE: typeof SettingsManager.NEVER_DEFAULT_VALUE = SettingsManager.NEVER_DEFAULT_VALUE;\n\n readonly disableTestEnvCheck: boolean;\n\n readonly #logger: LoggerInstanceManager;\n\n // eslint-disable-next-line @typescript-eslint/class-literal-property-style\n static get NEVER_DEFAULT_VALUE(): 'NEVER_DEFAULT_VALUE' {\n return 'NEVER_DEFAULT_VALUE';\n }\n\n static readNetworkValue(networkValue: SettingValue, defaultValue: SettingValue, key: string, logger: LoggerInstanceManager): SettingValue {\n let returnValue = networkValue;\n if (typeof networkValue === 'undefined') {\n returnValue = defaultValue;\n logger.info('Setting falling back to default as network value was defined', { key, defaultValue });\n }\n\n if (returnValue === SettingsManager.NEVER_DEFAULT_VALUE) {\n throw new Error('Cannot find value from network or cache, default value is set to never');\n }\n\n return returnValue;\n }\n\n constructor({\n serviceUrl, ttl = FIVE_MINUTES, disableTestEnvCheck = false, logger = Logger(),\n }: SettingsClassOptions = {}) {\n const localServiceUrl = findUrl(serviceUrl);\n\n this.#logger = logger;\n this.ttl = ttl;\n this.disableTestEnvCheck = disableTestEnvCheck;\n this.network = new Network({\n serviceUrl: localServiceUrl, logger,\n });\n }\n\n async get(\n key: SettingValue,\n defaultValue?: SettingValue,\n labels: Label[] = [],\n { timeout = 5000, rejectOnFail = false }: GetSettingOption = {},\n ): Promise<SettingValue> {\n if (typeof defaultValue === 'undefined') {\n throw new Error('Can\\'t get a key without defaultValue');\n }\n\n const cacheKey = this.getCacheKey(key, labels);\n const cacheValue = this.settingsCache.get(cacheKey);\n if (cacheValue !== undefined) {\n this.#logger.debug('setting found in cache', { cacheKey });\n if (WAITING_TO_NETWORK === cacheValue) {\n const [networkValue] = await once(this.networkEvents, cacheKey);\n if (networkValue instanceof Error && rejectOnFail) {\n throw networkValue;\n }\n return SettingsManager.readNetworkValue(networkValue, defaultValue, key, this.#logger);\n }\n return cacheValue;\n }\n\n if (!this.disableTestEnvCheck && process.env.NODE_ENV === 'test') {\n this.#logger.info('returning default value setting in TEST mode', { cacheKey });\n return defaultValue;\n }\n\n let networkValue;\n try {\n this.settingsCache.set(cacheKey, WAITING_TO_NETWORK, this.ttl);\n const networkResponse = await this.network.get(`/api/v1/settings/get-setting/${key}`, {\n params: {\n labels: labels.map(label => JSON.stringify(label)),\n },\n timeout,\n });\n networkValue = networkResponse.data.value;\n } catch (error) {\n this.#logger.error('Cant get setting from network', { error, rejectOnFail, key });\n if (rejectOnFail) {\n const errorToThrow = new CannotGetNetworkValueError();\n this.networkEvents.emit(cacheKey, errorToThrow);\n throw errorToThrow;\n }\n }\n\n this.networkEvents.emit(cacheKey, networkValue);\n let returnValue;\n try {\n returnValue = SettingsManager.readNetworkValue(networkValue, defaultValue, key, this.#logger);\n } catch (e) {\n this.settingsCache.del(cacheKey);\n throw e;\n }\n this.settingsCache.set(cacheKey, returnValue, this.ttl);\n return returnValue;\n }\n\n async getMultiple(\n settingsToGet: { key: string; defaultValue: SettingValue; }[],\n labels: Label[],\n { timeout = 5000, rejectOnFail = false }: GetSettingOption = {},\n ): Promise<SettingValue[]> {\n const cacheKeyCache = new Map<string, string>();\n const settingsToReturn = new Map();\n const settingsToFetch = new Set<string>();\n const cachedSettingsToAwait = new Set<string>();\n\n settingsToGet.forEach((obj) => {\n const cacheKey = this.getCacheKey(obj.key, labels);\n cacheKeyCache.set(obj.key, cacheKey);\n const cacheValue = this.settingsCache.get(cacheKey);\n if (cacheValue === undefined) {\n settingsToFetch.add(obj.key);\n return;\n }\n if (cacheValue === WAITING_TO_NETWORK) {\n cachedSettingsToAwait.add(obj.key);\n return;\n }\n settingsToReturn.set(obj.key, cacheValue);\n });\n\n if (process.env.NODE_ENV === 'test') {\n return settingsToGet.map(obj => settingsToReturn.get(obj.key) ?? obj.defaultValue);\n }\n\n if (cachedSettingsToAwait.size) {\n const keys = Array.from(cachedSettingsToAwait);\n const cached = await Promise.all(keys.map(key => once(this.networkEvents, cacheKeyCache.get(key)!)));\n cached.forEach(([networkValue]) => {\n if (networkValue instanceof Error && rejectOnFail) {\n throw networkValue;\n }\n settingsToReturn.set(keys.shift()!, networkValue);\n });\n }\n\n if (settingsToFetch.size) {\n const keys = Array.from(settingsToFetch);\n try {\n keys.forEach(key => this.settingsCache.set(cacheKeyCache.get(key)!, WAITING_TO_NETWORK, this.ttl));\n const { data: values } = await this.network.post<SettingValue[]>('/api/v1/settings/get-settings/_multiple', {\n keys,\n labels,\n skipEntityQueryAddition: true,\n }, {\n timeout,\n });\n\n keys.forEach((key, index) => {\n const { value } = values[index];\n settingsToReturn.set(key, value);\n this.networkEvents.emit(cacheKeyCache.get(key)!, value);\n });\n } catch (err) {\n this.#logger.error('Cant get setting from network', { err, settingsToFetch, labels });\n if (rejectOnFail) {\n const errorToThrow = new CannotGetNetworkValueError();\n settingsToFetch.forEach(key => this.networkEvents.emit(cacheKeyCache.get(key)!, errorToThrow));\n throw errorToThrow;\n }\n }\n }\n\n return settingsToGet.map((setting) => {\n const cacheKey = cacheKeyCache.get(setting.key)!;\n let returnValue;\n try {\n returnValue = SettingsManager.readNetworkValue(settingsToReturn.get(setting.key), setting.defaultValue, setting.key, this.#logger);\n } catch (err) {\n this.settingsCache.del(cacheKey);\n throw err;\n }\n if (settingsToFetch.has(setting.key)) {\n this.settingsCache.set(cacheKey, returnValue, this.ttl);\n }\n return returnValue;\n });\n }\n\n async getSettingsForMultipleEntities(\n settingsToGet: { key: string; defaultValue?: SettingValue; }[],\n entities: Entities,\n { timeout = 5000, skipCache }: { timeout?: number; skipCache?: boolean; } = {},\n ): Promise<ValueByEntity[]> {\n const keys = settingsToGet.map(s => s.key);\n\n const labels = convertEntitiesToLabels(entities);\n\n /** Cartesian product of `keys` & `labels` */\n const searchList = keys.flatMap(key => labels.map<[string, Label]>(label => ([key, label])));\n\n const toFetch: [string, Label][] = [];\n const waitingToNetwork: [string, Label][] = [];\n const result: ValueByEntity[] = [];\n\n const removeFromSearchList = (key: string, label: Label) => {\n const index = searchList.findIndex(([itemKey, itemLabel]) => {\n if (itemKey !== key) {\n return false;\n }\n const [itemEntityKey, itemEntityId] = Object.entries(itemLabel)[0];\n const [entityKey, entityId] = Object.entries(label)[0];\n return itemEntityKey === entityKey && itemEntityId === entityId;\n });\n if (index >= 0) {\n searchList.splice(index, 1);\n }\n };\n\n const pushToResult = ({ key, label, value }: { key: string; label: Label; value: SettingValue; }) => {\n removeFromSearchList(key, label);\n result.push({ key, ...label, value });\n };\n\n const getValueOrDefault = ({ value, key }: { value: unknown; key: string; }) => {\n if (typeof value !== 'undefined') {\n return value;\n }\n return settingsToGet.find(s => s.key === key)?.defaultValue;\n };\n\n if (skipCache) {\n toFetch.push(...searchList);\n } else {\n for (const [key, label] of searchList) {\n const cacheKey = this.getCacheKey(key, [label]);\n const cacheValue = this.settingsCache.get(cacheKey);\n\n if (cacheValue === undefined) {\n toFetch.push([key, label]);\n } else if (cacheValue === WAITING_TO_NETWORK) {\n waitingToNetwork.push([key, label]);\n } else {\n pushToResult({ key, value: cacheValue, label });\n }\n }\n }\n\n if (waitingToNetwork.length) {\n const networkResults = await Promise.all(waitingToNetwork.map(async ([key, label]) => {\n const values = await once(this.networkEvents, this.getCacheKey(key, [label]));\n return { values, key, label };\n }));\n\n for (const { values: [networkValue], key, label } of networkResults) {\n if (networkValue instanceof Error) {\n throw networkValue;\n }\n pushToResult({ key, value: networkValue, label });\n }\n }\n\n if (toFetch.length) {\n for (const [key, label] of toFetch) {\n this.settingsCache.set(this.getCacheKey(key, [label]), WAITING_TO_NETWORK, this.ttl);\n }\n\n const toFetchReduced = toFetch.reduce<{ keys: string[]; entities: Entities; }>((acc, [key, label]) => {\n acc.keys.push(key);\n const [entityKey, entityId] = Object.entries(label)[0];\n const entitiesKey = entityKey + 's' as keyof Entities;\n acc.entities[entitiesKey] ??= [];\n acc.entities[entitiesKey].push(entityId);\n return acc;\n }, { keys: [], entities: {} });\n\n let data;\n try {\n const res = await this.network.post('/api/v1/settings/get-settings/_multiple-entities', { ...toFetchReduced, skipCache }, { timeout });\n data = res.data;\n } catch (err) {\n this.#logger.error('Failed to get multiple setting from network', { err, toFetch });\n const errorToThrow = new CannotGetNetworkValueError();\n for (const [key, label] of toFetch) {\n this.networkEvents.emit(this.getCacheKey(key, [label]), errorToThrow);\n }\n throw errorToThrow;\n } finally {\n // clean all WAITING_TO_NETWORK\n for (const [key, label] of toFetch) {\n this.settingsCache.del(this.getCacheKey(key, [label]));\n }\n }\n\n const settingsArr = Array.isArray(data) ? data : [];\n for (const setting of settingsArr) {\n for (const entity of ENTITY_ID_NAMES) {\n const entityId = setting[entity];\n if (entityId) {\n const value = getValueOrDefault(setting);\n const { key } = setting;\n const label = { [entity]: entityId };\n\n pushToResult({ key, value, label });\n\n const cacheKey = this.getCacheKey(key, [label]);\n this.settingsCache.set(cacheKey, value, this.ttl);\n this.networkEvents.emit(cacheKey, value);\n }\n }\n }\n }\n\n const defaults = searchList.reduce<ValueByEntity[]>((acc, [key, label]) => {\n const value = getValueOrDefault({ value: undefined, key });\n if (value) {\n acc.push({ key, value, ...label });\n }\n return acc;\n }, []);\n return [...result, ...defaults];\n }\n\n setLocal(key: string, labels: Label[], value: SettingValue): void {\n const cacheKey = this.getCacheKey(key, labels);\n this.settingsCache.set<SettingValue>(cacheKey, value, this.ttl);\n }\n\n flush(): void {\n return this.settingsCache.flushAll();\n }\n\n getCacheKey(key: SettingValue, labels: Label[]): string {\n const newLabels = labels.map((l) => {\n if (l.time) {\n return {\n ...l,\n time: moment(l.time).startOf('hour').format(),\n day: moment(l.time).day(),\n };\n }\n\n if (l.location?.lat && l.location?.lng) {\n const h3Index = latLngToCell(l.location.lat, l.location.lng, 8);\n return {\n ...l,\n location: h3Index,\n };\n }\n\n return l;\n });\n\n const cacheKey = `${key}_${JSON.stringify(newLabels)}`;\n return cacheKey;\n }\n}\n\nexport default SettingsManager;\n"],"mappings":"8LAOA,MAAM,EAAe,GAAK,EACpB,EAAqB,mBAErB,EAAU,AAACA,GAAwB,IACnC,QAAQ,IAAI,yBAA2B,SAAS,QAAQ,IAAI,wBAAwB,OAAA,MAEpF,QAAQ,IAAI,WAAa,OAA6C,yBAApC,mCAiCxC,SAAS,EAAwBC,EAA6B,CAC5D,MAAO,QAAO,QAAQ,EAAS,CAC5B,IAAwB,CAAC,CAAC,EAAQ,EAAI,GAAK,CAE1C,IAAM,EAAiB,EAAO,MAAM,EAAG,EAAO,OAAS,EAAE,CAEzD,MAAO,CAAC,EAAgB,MAAM,KAAK,IAAI,IAAI,GAAK,AAAC,CAClD,EAAC,CACD,QAAe,CAAC,CAAC,EAAQ,EAAI,GAAK,EAAI,IAAI,IAAO,EAAG,GAAS,CAAI,GAAE,CAAC,AACxE,CAED,MAAM,EAAkB,CACtB,kBACA,UACA,iBACA,WACD,EAYD,IAAa,EAAb,cAAgD,KAAM,CAAE,EAElD,EAAN,MAAM,CAAgB,CACpB,IAEA,cAAoC,IAAI,EAExC,cAAiC,IAAI,EAErC,QAEA,oBAA2E,EAAgB,oBAE3F,oBAEA,QAGA,WAAW,qBAA6C,CACtD,MAAO,qBACR,CAED,OAAO,iBAAiBE,EAA4BC,EAA4BC,EAAaC,EAA6C,CACxI,IAAI,EAAc,EAMlB,GALW,aACT,EAAc,EACd,EAAO,KAAK,+DAAgE,CAAE,MAAK,cAAc,EAAC,EAGhG,IAAgB,EAAgB,oBAClC,KAAM,CAAI,MAAM,yEAAA,CAGlB,OAAO,CACR,CAED,YAAY,CACV,aAAY,MAAM,EAAc,uBAAsB,EAAO,SAAS,GAAQ,CACzD,CAAG,CAAE,EAAE,CAC5B,IAAM,EAAkB,EAAQ,EAAW,CAK3C,AAHA,KAAKJ,QAAU,EACf,KAAK,IAAM,EACX,KAAK,oBAAsB,EAC3B,KAAK,QAAU,IAAI,EAAQ,CACzB,WAAY,EAAiB,QAC9B,EACF,CAED,MAAM,IACJK,EACAC,EACAC,EAAkB,CAAE,EACpB,CAAE,UAAU,IAAM,gBAAe,EAAyB,CAAG,CAAE,EACxC,CACvB,GAAW,WACT,KAAM,CAAI,MAAM,uCAAA,CAGlB,IAAM,EAAW,KAAK,YAAY,EAAK,EAAO,CACxC,EAAa,KAAK,cAAc,IAAI,EAAS,CACnD,GAAI,QAAA,GAA0B,CAE5B,GADA,KAAKP,QAAQ,MAAM,yBAA0B,CAAE,UAAU,EAAC,CACtD,IAAuB,EAAY,CACrC,GAAM,CAACQ,EAAa,CAAG,KAAM,GAAK,KAAK,cAAe,EAAS,CAC/D,GAAIA,aAAwB,OAAS,EACnC,MAAMA,EAER,MAAO,GAAgB,iBAAiBA,EAAc,EAAc,EAAK,KAAKR,QAAQ,AACvF,CACD,OAAO,CACR,CAED,IAAK,KAAK,qBAAuB,QAAQ,IAAI,WAAa,OAExD,MADA,MAAKA,QAAQ,KAAK,+CAAgD,CAAE,UAAU,EAAC,CACxE,EAGT,IAAI,EACJ,GAAI,CACF,KAAK,cAAc,IAAI,EAAU,EAAoB,KAAK,IAAI,CAC9D,IAAM,EAAkB,KAAM,MAAK,QAAQ,KAAK,+BAA+B,EAAI,EAAG,CACpF,OAAQ,CACN,OAAQ,EAAO,IAAI,GAAS,KAAK,UAAU,EAAM,CAAC,AACnD,EACD,SACD,EAAC,CACF,EAAe,EAAgB,KAAK,KACrC,OAAQ,EAAO,CAEd,GADA,KAAKA,QAAQ,MAAM,gCAAiC,CAAE,QAAO,eAAc,KAAK,EAAC,CAC7E,EAAc,CAChB,IAAM,EAAe,IAAI,EAEzB,KADA,MAAK,cAAc,KAAK,EAAU,EAAa,CACzC,CACP,CACF,CAED,KAAK,cAAc,KAAK,EAAU,EAAa,CAC/C,IAAI,EACJ,GAAI,CACF,EAAc,EAAgB,iBAAiB,EAAc,EAAc,EAAK,KAAKA,QAAQ,AAC9F,OAAQ,EAAG,CAEV,KADA,MAAK,cAAc,IAAI,EAAS,CAC1B,CACP,CAED,MADA,MAAK,cAAc,IAAI,EAAU,EAAa,KAAK,IAAI,CAChD,CACR,CAED,MAAM,YACJS,EACAF,EACA,CAAE,UAAU,IAAM,gBAAe,EAAyB,CAAG,CAAE,EACtC,CACzB,IAAM,EAAgB,IAAI,IACpB,EAAmB,IAAI,IACvB,EAAkB,IAAI,IACtB,EAAwB,IAAI,IAiBlC,GAfA,EAAc,QAAQ,AAAC,GAAQ,CAC7B,IAAM,EAAW,KAAK,YAAY,EAAI,IAAK,EAAO,CAClD,EAAc,IAAI,EAAI,IAAK,EAAS,CACpC,IAAM,EAAa,KAAK,cAAc,IAAI,EAAS,CACnD,GAAI,QAAA,GAA0B,CAC5B,EAAgB,IAAI,EAAI,IAAI,CAC5B,MACD,CACD,GAAI,IAAe,EAAoB,CACrC,EAAsB,IAAI,EAAI,IAAI,CAClC,MACD,CACD,EAAiB,IAAI,EAAI,IAAK,EAAW,AAC1C,EAAC,CAEE,QAAQ,IAAI,WAAa,OAC3B,MAAO,GAAc,IAAI,GAAO,EAAiB,IAAI,EAAI,IAAI,EAAI,EAAI,aAAa,CAGpF,GAAI,EAAsB,KAAM,CAC9B,IAAM,EAAO,MAAM,KAAK,EAAsB,CACxC,EAAS,KAAM,SAAQ,IAAI,EAAK,IAAI,GAAO,EAAK,KAAK,cAAe,EAAc,IAAI,EAAI,CAAE,CAAC,CAAC,CACpG,EAAO,QAAQ,CAAC,CAAC,EAAa,GAAK,CACjC,GAAI,aAAwB,OAAS,EACnC,MAAM,EAER,EAAiB,IAAI,EAAK,OAAO,CAAG,EAAa,AAClD,EAAC,AACH,CAED,GAAI,EAAgB,KAAM,CACxB,IAAM,EAAO,MAAM,KAAK,EAAgB,CACxC,GAAI,CACF,EAAK,QAAQ,GAAO,KAAK,cAAc,IAAI,EAAc,IAAI,EAAI,CAAG,EAAoB,KAAK,IAAI,CAAC,CAClG,GAAM,CAAE,KAAM,EAAQ,CAAG,KAAM,MAAK,QAAQ,KAAqB,0CAA2C,CAC1G,OACA,SACA,yBAAyB,CAC1B,EAAE,CACD,SACD,EAAC,CAEF,EAAK,QAAQ,CAAC,EAAK,IAAU,CAC3B,GAAM,CAAE,QAAO,CAAG,EAAO,GAEzB,AADA,EAAiB,IAAI,EAAK,EAAM,CAChC,KAAK,cAAc,KAAK,EAAc,IAAI,EAAI,CAAG,EAAM,AACxD,EAAC,AACH,OAAQ,EAAK,CAEZ,GADA,KAAKP,QAAQ,MAAM,gCAAiC,CAAE,MAAK,kBAAiB,QAAQ,EAAC,CACjF,EAAc,CAChB,IAAM,EAAe,IAAI,EAEzB,KADA,GAAgB,QAAQ,GAAO,KAAK,cAAc,KAAK,EAAc,IAAI,EAAI,CAAG,EAAa,CAAC,CACxF,CACP,CACF,CACF,CAED,MAAO,GAAc,IAAI,AAAC,GAAY,CACpC,IAAM,EAAW,EAAc,IAAI,EAAQ,IAAI,CAC3C,EACJ,GAAI,CACF,EAAc,EAAgB,iBAAiB,EAAiB,IAAI,EAAQ,IAAI,CAAE,EAAQ,aAAc,EAAQ,IAAK,KAAKA,QAAQ,AACnI,OAAQ,EAAK,CAEZ,KADA,MAAK,cAAc,IAAI,EAAS,CAC1B,CACP,CAID,MAHI,GAAgB,IAAI,EAAQ,IAAI,EAClC,KAAK,cAAc,IAAI,EAAU,EAAa,KAAK,IAAI,CAElD,CACR,EAAC,AACH,CAED,MAAM,+BACJU,EACAX,EACA,CAAE,UAAU,IAAM,YAAuD,CAAG,CAAE,EACpD,CAC1B,IAAM,EAAO,EAAc,IAAI,GAAK,EAAE,IAAI,CAEpC,EAAS,EAAwB,EAAS,CAG1C,EAAa,EAAK,QAAQ,GAAO,EAAO,IAAqB,GAAU,CAAC,EAAK,CAAM,EAAE,CAAC,CAEtFY,EAA6B,CAAE,EAC/BC,EAAsC,CAAE,EACxCC,EAA0B,CAAE,EAE5B,EAAuB,CAACV,EAAaW,IAAiB,CAC1D,IAAM,EAAQ,EAAW,UAAU,CAAC,CAAC,EAAS,EAAU,GAAK,CAC3D,GAAI,IAAY,EACd,OAAO,EAET,GAAM,CAAC,EAAe,EAAa,CAAG,OAAO,QAAQ,EAAU,CAAC,GAC1D,CAAC,EAAW,EAAS,CAAG,OAAO,QAAQ,EAAM,CAAC,GACpD,OAAO,IAAkB,GAAa,IAAiB,CACxD,EAAC,CACF,AAAI,GAAS,GACX,EAAW,OAAO,EAAO,EAAE,AAE9B,EAEK,EAAe,CAAC,CAAE,MAAK,QAAO,QAA4D,GAAK,CAEnG,AADA,EAAqB,EAAK,EAAM,CAChC,EAAO,KAAK,CAAE,MAAK,GAAG,EAAO,OAAO,EAAC,AACtC,EAEK,EAAoB,CAAC,CAAE,QAAO,MAAuC,GAC9D,WAGJ,EAAc,KAAK,GAAK,EAAE,MAAQ,EAAI,EAAE,aAFtC,EAKX,GAAI,EACF,EAAQ,KAAK,GAAG,EAAW,MAE3B,IAAK,GAAM,CAAC,EAAK,EAAM,GAAI,EAAY,CACrC,IAAM,EAAW,KAAK,YAAY,EAAK,CAAC,CAAM,EAAC,CACzC,EAAa,KAAK,cAAc,IAAI,EAAS,CAEnD,AAAI,QAAA,GACF,EAAQ,KAAK,CAAC,EAAK,CAAM,EAAC,CACjB,IAAe,EACxB,EAAiB,KAAK,CAAC,EAAK,CAAM,EAAC,CAEnC,EAAa,CAAE,MAAK,MAAO,EAAY,OAAO,EAAC,AAElD,CAGH,GAAI,EAAiB,OAAQ,CAC3B,IAAM,EAAiB,KAAM,SAAQ,IAAI,EAAiB,IAAI,MAAO,CAAC,EAAK,EAAM,GAAK,CACpF,IAAM,EAAS,KAAM,GAAK,KAAK,cAAe,KAAK,YAAY,EAAK,CAAC,CAAM,EAAC,CAAC,CAC7E,MAAO,CAAE,SAAQ,MAAK,OAAO,CAC9B,EAAC,CAAC,CAEH,IAAK,GAAM,CAAE,OAAQ,CAAC,EAAa,CAAE,MAAK,QAAO,GAAI,EAAgB,CACnE,GAAI,aAAwB,MAC1B,MAAM,EAER,EAAa,CAAE,MAAK,MAAO,EAAc,OAAO,EAAC,AAClD,CACF,CAED,GAAI,EAAQ,OAAQ,CAClB,IAAK,GAAM,CAAC,EAAK,EAAM,GAAI,EACzB,KAAK,cAAc,IAAI,KAAK,YAAY,EAAK,CAAC,CAAM,EAAC,CAAE,EAAoB,KAAK,IAAI,CAGtF,IAAM,EAAiB,EAAQ,OAAgD,CAAC,EAAK,CAAC,EAAK,EAAM,GAAK,CACpG,EAAI,KAAK,KAAK,EAAI,CAClB,GAAM,CAAC,EAAW,EAAS,CAAG,OAAO,QAAQ,EAAM,CAAC,GAC9C,EAAc,EAAY,IAGhC,OAFA,EAAI,SAAS,KAAiB,CAAE,EAChC,EAAI,SAAS,GAAa,KAAK,EAAS,CACjC,CACR,EAAE,CAAE,KAAM,CAAE,EAAE,SAAU,CAAE,CAAE,EAAC,CAE1B,EACJ,GAAI,CACF,IAAM,EAAM,KAAM,MAAK,QAAQ,KAAK,mDAAoD,CAAE,GAAG,EAAgB,WAAW,EAAE,CAAE,SAAS,EAAC,CACtI,EAAO,EAAI,IACZ,OAAQ,EAAK,CACZ,KAAKd,QAAQ,MAAM,8CAA+C,CAAE,MAAK,SAAS,EAAC,CACnF,IAAM,EAAe,IAAI,EACzB,IAAK,GAAM,CAAC,EAAK,EAAM,GAAI,EACzB,KAAK,cAAc,KAAK,KAAK,YAAY,EAAK,CAAC,CAAM,EAAC,CAAE,EAAa,CAEvE,MAAM,CACP,QAAS,CAER,IAAK,GAAM,CAAC,EAAK,EAAM,GAAI,EACzB,KAAK,cAAc,IAAI,KAAK,YAAY,EAAK,CAAC,CAAM,EAAC,CAAC,AAEzD,CAED,IAAM,EAAc,MAAM,QAAQ,EAAK,CAAG,EAAO,CAAE,EACnD,IAAK,IAAM,KAAW,EACpB,IAAK,IAAM,KAAU,EAAiB,CACpC,IAAM,EAAW,EAAQ,GACzB,GAAI,EAAU,CACZ,IAAM,EAAQ,EAAkB,EAAQ,CAClC,CAAE,MAAK,CAAG,EACV,EAAQ,EAAG,GAAS,CAAU,EAEpC,EAAa,CAAE,MAAK,QAAO,OAAO,EAAC,CAEnC,IAAM,EAAW,KAAK,YAAY,EAAK,CAAC,CAAM,EAAC,CAE/C,AADA,KAAK,cAAc,IAAI,EAAU,EAAO,KAAK,IAAI,CACjD,KAAK,cAAc,KAAK,EAAU,EAAM,AACzC,CACF,CAEJ,CAED,IAAM,EAAW,EAAW,OAAwB,CAAC,EAAK,CAAC,EAAK,EAAM,GAAK,CACzE,IAAM,EAAQ,EAAkB,CAAE,UAAA,GAAkB,KAAK,EAAC,CAI1D,OAHI,GACF,EAAI,KAAK,CAAE,MAAK,QAAO,GAAG,CAAO,EAAC,CAE7B,CACR,EAAE,CAAE,EAAC,CACN,MAAO,CAAC,GAAG,EAAQ,GAAG,CAAS,CAChC,CAED,SAASG,EAAaI,EAAiBQ,EAA2B,CAChE,IAAM,EAAW,KAAK,YAAY,EAAK,EAAO,CAC9C,KAAK,cAAc,IAAkB,EAAU,EAAO,KAAK,IAAI,AAChE,CAED,OAAc,CACZ,MAAO,MAAK,cAAc,UAAU,AACrC,CAED,YAAYV,EAAmBE,EAAyB,CACtD,IAAM,EAAY,EAAO,IAAI,AAAC,GAAM,CAClC,GAAI,EAAE,KACJ,MAAO,CACL,GAAG,EACH,KAAM,EAAO,EAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,QAAQ,CAC7C,IAAK,EAAO,EAAE,KAAK,CAAC,KAAK,AAC1B,EAGH,GAAI,EAAE,UAAU,KAAO,EAAE,UAAU,IAAK,CACtC,IAAM,EAAU,EAAa,EAAE,SAAS,IAAK,EAAE,SAAS,IAAK,EAAE,CAC/D,MAAO,CACL,GAAG,EACH,SAAU,CACX,CACF,CAED,OAAO,CACR,EAAC,CAEI,GAAY,EAAE,EAAI,GAAG,KAAK,UAAU,EAAU,CAAC,EACrD,OAAO,CACR,CACF,EAED,EAAe"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/settings",
3
- "version": "3.1.6-beta.0",
3
+ "version": "3.1.7",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -24,7 +24,7 @@
24
24
  ],
25
25
  "scripts": {
26
26
  "start": "ts-node src/index.ts",
27
- "build": "tsup",
27
+ "build": "tsdown",
28
28
  "prepublish": "node --run build",
29
29
  "linter": "eslint .",
30
30
  "test": "vitest",
@@ -47,12 +47,9 @@
47
47
  "@autofleet/logger": "^4.2.1",
48
48
  "@types/nock": "^11.1.0",
49
49
  "@types/node": "^18.19.75",
50
- "@vitest/coverage-v8": "^3.0.5",
51
50
  "nock": "^14.0.1",
52
51
  "ts-node": "^8.6.2",
53
- "tsup": "^8.3.6",
54
- "typescript": "^5.7.3",
55
- "vitest": "^3.0.5"
52
+ "typescript": "^5.7.3"
56
53
  },
57
54
  "author": "",
58
55
  "license": "Proprietary"