@autofleet/settings 3.1.24 → 3.1.25

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,2 +1,2 @@
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));let c=require(`@autofleet/network`);c=s(c);let l=require(`@autofleet/logger`);l=s(l);let u=require(`node-cache`);u=s(u);let d=require(`node:events`);d=s(d);let f=require(`moment`);f=s(f);let p=require(`h3-js`);p=s(p);const m=300,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])=>[e.slice(0,e.length-1),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{#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:t,ttl:n=300,disableTestEnvCheck:r=!1,logger:i=(0,l.default)()}={}){this.settingsCache=new u.default,this.networkEvents=new d.default,this.NEVER_DEFAULT_VALUE=e.NEVER_DEFAULT_VALUE;let a=g(t);this.#logger=i,this.ttl=n,this.disableTestEnvCheck=r,this.network=new c.default({serviceUrl:a,logger:i})}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),c=(await this.network.get(`/api/v1/settings/get-setting/${t}`,{params:{labels:r.map(e=>JSON.stringify(e))},timeout:i})).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);(await Promise.all(e.map(e=>(0,d.once)(this.networkEvents,a.get(e))))).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])=>({values:await(0,d.once)(this.networkEvents,this.getCacheKey(e,[t])),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{t=(await this.network.post(`/api/v1/settings/get-settings/_multiple-entities`,{...e,skipCache:r},{timeout:n})).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});return`${e}_${JSON.stringify(n)}`}},x=b;exports.CannotGetNetworkValueError=y,exports.default=x;
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));let c=require(`@autofleet/network`);c=s(c);let l=require(`@autofleet/logger`);l=s(l);let u=require(`node-cache`);u=s(u);let d=require(`node:events`);d=s(d);let f=require(`moment`);f=s(f);let p=require(`h3-js`);const m=300,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])=>[e.slice(0,e.length-1),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{#e;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:t,ttl:n=300,disableTestEnvCheck:r=!1,logger:i=(0,l.default)()}={}){this.settingsCache=new u.default,this.networkEvents=new d.default,this.NEVER_DEFAULT_VALUE=e.NEVER_DEFAULT_VALUE;let a=g(t);this.#e=i,this.ttl=n,this.disableTestEnvCheck=r,this.network=new c.default({serviceUrl:a,logger:i})}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.#e.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.#e)}return s}if(!this.disableTestEnvCheck&&process.env.NODE_ENV===`test`)return this.#e.info(`returning default value setting in TEST mode`,{cacheKey:o}),n;let c;try{this.settingsCache.set(o,h,this.ttl),c=(await this.network.get(`/api/v1/settings/get-setting/${t}`,{params:{labels:r.map(e=>JSON.stringify(e))},timeout:i})).data.value}catch(e){if(this.#e.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.#e)}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);(await Promise.all(e.map(e=>(0,d.once)(this.networkEvents,a.get(e))))).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.#e.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.#e)}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])=>({values:await(0,d.once)(this.networkEvents,this.getCacheKey(e,[t])),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{t=(await this.network.post(`/api/v1/settings/get-settings/_multiple-entities`,{...e,skipCache:r},{timeout:n})).data}catch(e){this.#e.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});return`${e}_${JSON.stringify(n)}`}},x=b;exports.CannotGetNetworkValueError=y,exports.default=x;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["#logger","NodeCache","EventEmitter","Network","networkValue","toFetch: [string, Label][]","waitingToNetwork: [string, Label][]","result: ValueByEntity[]"],"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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"}
1
+ {"version":3,"file":"index.cjs","names":["#logger","NodeCache","EventEmitter","Network","networkValue","toFetch: [string, Label][]","waitingToNetwork: [string, Label][]","result: ValueByEntity[]"],"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.js CHANGED
@@ -1,2 +1,2 @@
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=`waitingToNetwork`,c=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 l(e){return Object.entries(e).map(([e,t])=>[e.slice(0,e.length-1),Array.from(new Set(t))]).flatMap(([e,t])=>t.map(t=>({[e]:t})))}const u=[`businessModelId`,`fleetId`,`demandSourceId`,`contextId`];var d=class extends Error{},f=class f{#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===f.NEVER_DEFAULT_VALUE)throw Error(`Cannot find value from network or cache, default value is set to never`);return i}constructor({serviceUrl:i,ttl:a=300,disableTestEnvCheck:o=!1,logger:s=t()}={}){this.settingsCache=new n,this.networkEvents=new r,this.NEVER_DEFAULT_VALUE=f.NEVER_DEFAULT_VALUE;let l=c(i);this.#logger=s,this.ttl=a,this.disableTestEnvCheck=o,this.network=new e({serviceUrl:l,logger:s})}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),c=this.settingsCache.get(o);if(c!==void 0){if(this.#logger.debug(`setting found in cache`,{cacheKey:o}),s===c){let[n]=await i(this.networkEvents,o);if(n instanceof Error&&a)throw n;return f.readNetworkValue(n,t,e,this.#logger)}return c}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,s,this.ttl),l=(await this.network.get(`/api/v1/settings/get-setting/${e}`,{params:{labels:n.map(e=>JSON.stringify(e))},timeout:r})).data.value}catch(t){if(this.#logger.error(`Cant get setting from network`,{error:t,rejectOnFail:a,key:e}),a){let e=new d;throw this.networkEvents.emit(o,e),e}}this.networkEvents.emit(o,l);let u;try{u=f.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,c=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){c.add(e.key);return}if(r===s){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);(await Promise.all(e.map(e=>i(this.networkEvents,a.get(e))))).forEach(([t])=>{if(t instanceof Error&&r)throw t;o.set(e.shift(),t)})}if(c.size){let e=Array.from(c);try{e.forEach(e=>this.settingsCache.set(a.get(e),s,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:c,labels:t}),r){let e=new d;throw c.forEach(t=>this.networkEvents.emit(a.get(t),e)),e}}}return e.map(e=>{let t=a.get(e.key),n;try{n=f.readNetworkValue(o.get(e.key),e.defaultValue,e.key,this.#logger)}catch(e){throw this.settingsCache.del(t),e}return c.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=l(t),c=a.flatMap(e=>o.map(t=>[e,t])),f=[],p=[],m=[],h=(e,t)=>{let n=c.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&&c.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)f.push(...c);else for(let[e,t]of c){let n=this.getCacheKey(e,[t]),r=this.settingsCache.get(n);r===void 0?f.push([e,t]):r===s?p.push([e,t]):g({key:e,value:r,label:t})}if(p.length){let e=await Promise.all(p.map(async([e,t])=>({values:await i(this.networkEvents,this.getCacheKey(e,[t])),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(f.length){for(let[e,t]of f)this.settingsCache.set(this.getCacheKey(e,[t]),s,this.ttl);let e=f.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{t=(await this.network.post(`/api/v1/settings/get-settings/_multiple-entities`,{...e,skipCache:r},{timeout:n})).data}catch(e){this.#logger.error(`Failed to get multiple setting from network`,{err:e,toFetch:f});let t=new d;for(let[e,n]of f)this.networkEvents.emit(this.getCacheKey(e,[n]),t);throw t}finally{for(let[e,t]of f)this.settingsCache.del(this.getCacheKey(e,[t]))}let i=Array.isArray(t)?t:[];for(let e of i)for(let t of u){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=c.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});return`${e}_${JSON.stringify(n)}`}};export{d as CannotGetNetworkValueError,f as default};
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=`waitingToNetwork`,c=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 l(e){return Object.entries(e).map(([e,t])=>[e.slice(0,e.length-1),Array.from(new Set(t))]).flatMap(([e,t])=>t.map(t=>({[e]:t})))}const u=[`businessModelId`,`fleetId`,`demandSourceId`,`contextId`];var d=class extends Error{},f=class f{#e;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===f.NEVER_DEFAULT_VALUE)throw Error(`Cannot find value from network or cache, default value is set to never`);return i}constructor({serviceUrl:i,ttl:a=300,disableTestEnvCheck:o=!1,logger:s=t()}={}){this.settingsCache=new n,this.networkEvents=new r,this.NEVER_DEFAULT_VALUE=f.NEVER_DEFAULT_VALUE;let l=c(i);this.#e=s,this.ttl=a,this.disableTestEnvCheck=o,this.network=new e({serviceUrl:l,logger:s})}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),c=this.settingsCache.get(o);if(c!==void 0){if(this.#e.debug(`setting found in cache`,{cacheKey:o}),s===c){let[n]=await i(this.networkEvents,o);if(n instanceof Error&&a)throw n;return f.readNetworkValue(n,t,e,this.#e)}return c}if(!this.disableTestEnvCheck&&process.env.NODE_ENV===`test`)return this.#e.info(`returning default value setting in TEST mode`,{cacheKey:o}),t;let l;try{this.settingsCache.set(o,s,this.ttl),l=(await this.network.get(`/api/v1/settings/get-setting/${e}`,{params:{labels:n.map(e=>JSON.stringify(e))},timeout:r})).data.value}catch(t){if(this.#e.error(`Cant get setting from network`,{error:t,rejectOnFail:a,key:e}),a){let e=new d;throw this.networkEvents.emit(o,e),e}}this.networkEvents.emit(o,l);let u;try{u=f.readNetworkValue(l,t,e,this.#e)}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,c=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){c.add(e.key);return}if(r===s){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);(await Promise.all(e.map(e=>i(this.networkEvents,a.get(e))))).forEach(([t])=>{if(t instanceof Error&&r)throw t;o.set(e.shift(),t)})}if(c.size){let e=Array.from(c);try{e.forEach(e=>this.settingsCache.set(a.get(e),s,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.#e.error(`Cant get setting from network`,{err:e,settingsToFetch:c,labels:t}),r){let e=new d;throw c.forEach(t=>this.networkEvents.emit(a.get(t),e)),e}}}return e.map(e=>{let t=a.get(e.key),n;try{n=f.readNetworkValue(o.get(e.key),e.defaultValue,e.key,this.#e)}catch(e){throw this.settingsCache.del(t),e}return c.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=l(t),c=a.flatMap(e=>o.map(t=>[e,t])),f=[],p=[],m=[],h=(e,t)=>{let n=c.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&&c.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)f.push(...c);else for(let[e,t]of c){let n=this.getCacheKey(e,[t]),r=this.settingsCache.get(n);r===void 0?f.push([e,t]):r===s?p.push([e,t]):g({key:e,value:r,label:t})}if(p.length){let e=await Promise.all(p.map(async([e,t])=>({values:await i(this.networkEvents,this.getCacheKey(e,[t])),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(f.length){for(let[e,t]of f)this.settingsCache.set(this.getCacheKey(e,[t]),s,this.ttl);let e=f.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{t=(await this.network.post(`/api/v1/settings/get-settings/_multiple-entities`,{...e,skipCache:r},{timeout:n})).data}catch(e){this.#e.error(`Failed to get multiple setting from network`,{err:e,toFetch:f});let t=new d;for(let[e,n]of f)this.networkEvents.emit(this.getCacheKey(e,[n]),t);throw t}finally{for(let[e,t]of f)this.settingsCache.del(this.getCacheKey(e,[t]))}let i=Array.isArray(t)?t:[];for(let e of i)for(let t of u){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=c.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});return`${e}_${JSON.stringify(n)}`}};export{d as CannotGetNetworkValueError,f as default};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["#logger","networkValue","toFetch: [string, Label][]","waitingToNetwork: [string, Label][]","result: ValueByEntity[]"],"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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"}
1
+ {"version":3,"file":"index.js","names":["#logger","networkValue","toFetch: [string, Label][]","waitingToNetwork: [string, Label][]","result: ValueByEntity[]"],"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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/settings",
3
- "version": "3.1.24",
3
+ "version": "3.1.25",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",