@magnet.me/consultant 1.3.2 → 1.4.1

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/out/config.js CHANGED
@@ -63,6 +63,10 @@ const configUpdater = (consulHost, prefix, service, callback) => {
63
63
  if (callback) {
64
64
  callback(properties);
65
65
  }
66
+ } catch (e) {
67
+ timeout = 5000; // eslint-disable-next-line no-console
68
+
69
+ console.warn(`Error retrieving data from Consul: ${e}`);
66
70
  } finally {
67
71
  if (!shutdown) {
68
72
  timeoutId = setTimeout(self.poll, timeout);
package/out/config.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.js"],"names":["configUpdater","consulHost","prefix","service","callback","consulIndex","timeoutId","shutdown","self","poll","timeout","prefixUri","uri","name","response","headers","props","userAgent","status","prefixText","console","warn","text","json","properties","parseBody","setTimeout","stop","clearTimeout","body","map","kvPair","key","Key","value","Value","filter","reduce","Object","assign","updateConfig","newConfig","callbacks","updates","keys","deletes","forEach","length","initializeConfiguration","Set","process","env","CONSUL_HOST","defaultHost","identifier","liveProperties","updater","newProperties","getProperties","register","add","deregister","delete"],"mappings":"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","sourcesContent":["import fetch from 'node-fetch';\nimport props from './properties';\nimport fetchIdentifier from './identifier';\nimport {parseKey, keyApplies} from './key-parser';\nimport atob from 'atob';\n\nconst configUpdater = (consulHost, prefix, service, callback) => {\n\tlet consulIndex;\n\tlet timeoutId;\n\tlet shutdown = false;\n\tconst self = {\n\t\tasync poll() {\n\t\t\tlet timeout = 500;\n\t\t\ttry {\n\t\t\t\tconst prefixUri = prefix ? `${prefix}/` : '';\n\t\t\t\tlet uri = `${consulHost}/v1/kv/${prefixUri}${service.name}/?recurse=true`;\n\t\t\t\tif (consulIndex) {\n\t\t\t\t\turi += `&index=${consulIndex}`;\n\t\t\t\t}\n\t\t\t\tconst response = await fetch(uri, {\n\t\t\t\t\theaders : {\n\t\t\t\t\t\t'accept' : 'application/json',\n\t\t\t\t\t\t'content-type' : 'application/json',\n\t\t\t\t\t\t'user-agent' : props.userAgent\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconsulIndex = response.headers['x-consul-index'];\n\t\t\t\tif (response.status === 404) {\n\t\t\t\t\ttimeout = 5000;\n\t\t\t\t\tconst prefixText = prefix ? ` with prefix '${prefix}'` : '';\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.warn(`'${service.name}'${prefixText} cannot be found in Consul`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (response.status !== 200) {\n\t\t\t\t\ttimeout = 60000;\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.warn(`Error retrieving data from Consul: ${response.status}: ${await response.text()}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst json = await response.json();\n\t\t\t\tconst properties = parseBody(json, prefix, service);\n\t\t\t\tif (callback) {\n\t\t\t\t\tcallback(properties);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinally {\n\t\t\t\tif (!shutdown) {\n\t\t\t\t\ttimeoutId = setTimeout(self.poll, timeout);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tstop() {\n\t\t\tshutdown = true;\n\t\t\tif (timeoutId) {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t}\n\t\t}\n\t};\n\n\treturn self;\n};\n\n/**\n * Parses the fetched config from Consul and converts it to a proper object.\n * @param body {Array} - The response body\n * @param prefix {string} - The prefix to extract from the key path\n * @param service {Object} - The service identifier to match key specifiers against\n * @return {Object} A properties object containing all valid properties as specified in the body\n */\nfunction parseBody(body, prefix, service) {\n\treturn body.map(kvPair => {\n\t\treturn {key : parseKey(kvPair.Key, prefix), value : kvPair.Value};\n\t})\n\t\t.filter(kvPair => kvPair.key.key && keyApplies(kvPair.key, service))\n\t\t.map(kvPair => {\n\t\t\treturn {[kvPair.key.key] : atob(kvPair.value)};\n\t\t})\n\t\t.reduce((properties, kvPair) => Object.assign(properties, kvPair), {});\n}\n\nconst updateConfig = (properties, newConfig, callbacks) => {\n\tconst updates = Object.keys(newConfig).filter(key => properties[key] !== newConfig[key]);\n\n\tObject.assign(properties, newConfig);\n\n\tconst deletes = Object.keys(properties).filter(key => !newConfig[key]);\n\tdeletes.forEach(key => delete properties[key]);\n\n\tif (updates.length > 0 || deletes.length > 0) {\n\t\tcallbacks.forEach(callback => callback(Object.assign({}, properties)));\n\t}\n};\n\nexport default async function initializeConfiguration({consulHost, service, prefix}) {\n\tconst callbacks = new Set();\n\n\tconsulHost = consulHost || process.env.CONSUL_HOST || props.defaultHost;\n\n\tconst identifier = await fetchIdentifier(service, consulHost);\n\n\tlet liveProperties = {};\n\n\tconst updater = configUpdater(consulHost, prefix, identifier, (newProperties) => {\n\t\tupdateConfig(liveProperties, newProperties, callbacks);\n\t});\n\n\tawait updater.poll();\n\n\treturn {\n\t\tgetProperties() {\n\t\t\treturn Object.assign({}, liveProperties);\n\t\t},\n\t\tregister(callback) {\n\t\t\tcallbacks.add(callback);\n\t\t},\n\t\tderegister(callback) {\n\t\t\tcallbacks.delete(callback);\n\t\t},\n\t\tstop() {\n\t\t\tupdater.stop();\n\t\t}\n\t};\n}\n"],"file":"config.js"}
1
+ {"version":3,"sources":["../src/config.js"],"names":["configUpdater","consulHost","prefix","service","callback","consulIndex","timeoutId","shutdown","self","poll","timeout","prefixUri","uri","name","response","headers","props","userAgent","status","prefixText","console","warn","text","json","properties","parseBody","e","setTimeout","stop","clearTimeout","body","map","kvPair","key","Key","value","Value","filter","reduce","Object","assign","updateConfig","newConfig","callbacks","updates","keys","deletes","forEach","length","initializeConfiguration","Set","process","env","CONSUL_HOST","defaultHost","identifier","liveProperties","updater","newProperties","getProperties","register","add","deregister","delete"],"mappings":"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","sourcesContent":["import fetch from 'node-fetch';\nimport props from './properties';\nimport fetchIdentifier from './identifier';\nimport {parseKey, keyApplies} from './key-parser';\nimport atob from 'atob';\n\nconst configUpdater = (consulHost, prefix, service, callback) => {\n\tlet consulIndex;\n\tlet timeoutId;\n\tlet shutdown = false;\n\tconst self = {\n\t\tasync poll() {\n\t\t\tlet timeout = 500;\n\t\t\ttry {\n\t\t\t\tconst prefixUri = prefix ? `${prefix}/` : '';\n\t\t\t\tlet uri = `${consulHost}/v1/kv/${prefixUri}${service.name}/?recurse=true`;\n\t\t\t\tif (consulIndex) {\n\t\t\t\t\turi += `&index=${consulIndex}`;\n\t\t\t\t}\n\t\t\t\tconst response = await fetch(uri, {\n\t\t\t\t\theaders : {\n\t\t\t\t\t\t'accept' : 'application/json',\n\t\t\t\t\t\t'content-type' : 'application/json',\n\t\t\t\t\t\t'user-agent' : props.userAgent\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconsulIndex = response.headers['x-consul-index'];\n\t\t\t\tif (response.status === 404) {\n\t\t\t\t\ttimeout = 5000;\n\t\t\t\t\tconst prefixText = prefix ? ` with prefix '${prefix}'` : '';\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.warn(`'${service.name}'${prefixText} cannot be found in Consul`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (response.status !== 200) {\n\t\t\t\t\ttimeout = 60000;\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.warn(`Error retrieving data from Consul: ${response.status}: ${await response.text()}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst json = await response.json();\n\t\t\t\tconst properties = parseBody(json, prefix, service);\n\t\t\t\tif (callback) {\n\t\t\t\t\tcallback(properties);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e) {\n\t\t\t\ttimeout = 5000;\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn(`Error retrieving data from Consul: ${e}`);\n\t\t\t}\n\t\t\tfinally {\n\t\t\t\tif (!shutdown) {\n\t\t\t\t\ttimeoutId = setTimeout(self.poll, timeout);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tstop() {\n\t\t\tshutdown = true;\n\t\t\tif (timeoutId) {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t}\n\t\t}\n\t};\n\n\treturn self;\n};\n\n/**\n * Parses the fetched config from Consul and converts it to a proper object.\n * @param body {Array} - The response body\n * @param prefix {string} - The prefix to extract from the key path\n * @param service {Object} - The service identifier to match key specifiers against\n * @return {Object} A properties object containing all valid properties as specified in the body\n */\nfunction parseBody(body, prefix, service) {\n\treturn body.map(kvPair => {\n\t\treturn {key : parseKey(kvPair.Key, prefix), value : kvPair.Value};\n\t})\n\t\t.filter(kvPair => kvPair.key.key && keyApplies(kvPair.key, service))\n\t\t.map(kvPair => {\n\t\t\treturn {[kvPair.key.key] : atob(kvPair.value)};\n\t\t})\n\t\t.reduce((properties, kvPair) => Object.assign(properties, kvPair), {});\n}\n\nconst updateConfig = (properties, newConfig, callbacks) => {\n\tconst updates = Object.keys(newConfig).filter(key => properties[key] !== newConfig[key]);\n\n\tObject.assign(properties, newConfig);\n\n\tconst deletes = Object.keys(properties).filter(key => !newConfig[key]);\n\tdeletes.forEach(key => delete properties[key]);\n\n\tif (updates.length > 0 || deletes.length > 0) {\n\t\tcallbacks.forEach(callback => callback(Object.assign({}, properties)));\n\t}\n};\n\nexport default async function initializeConfiguration({consulHost, service, prefix}) {\n\tconst callbacks = new Set();\n\n\tconsulHost = consulHost || process.env.CONSUL_HOST || props.defaultHost;\n\n\tconst identifier = await fetchIdentifier(service, consulHost);\n\n\tlet liveProperties = {};\n\n\tconst updater = configUpdater(consulHost, prefix, identifier, (newProperties) => {\n\t\tupdateConfig(liveProperties, newProperties, callbacks);\n\t});\n\n\tawait updater.poll();\n\n\treturn {\n\t\tgetProperties() {\n\t\t\treturn Object.assign({}, liveProperties);\n\t\t},\n\t\tregister(callback) {\n\t\t\tcallbacks.add(callback);\n\t\t},\n\t\tderegister(callback) {\n\t\t\tcallbacks.delete(callback);\n\t\t},\n\t\tstop() {\n\t\t\tupdater.stop();\n\t\t}\n\t};\n}\n"],"file":"config.js"}
package/out/index.d.ts CHANGED
@@ -24,7 +24,7 @@ declare module "@magnet.me/consultant" {
24
24
 
25
25
  interface ConfigArguments {
26
26
  consulHost?: string;
27
- service: Service;
27
+ service: ServiceIdentifier;
28
28
  prefix?: string;
29
29
  }
30
30
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magnet.me/consultant",
3
- "version": "1.3.2",
3
+ "version": "1.4.1",
4
4
  "description": "A library to register services to Consul and listen for property changes.",
5
5
  "main": "out/index.js",
6
6
  "scripts": {