apollo-declare

The Ctrip's apollo client with pre-declared configuration keys

Usage no npm install needed!

<script type="module">
  import apolloDeclare from 'https://cdn.skypack.dev/apollo-declare';
</script>

README

Build Status Coverage

apollo-declare

ctrip-apollo(the Ctrip's apollo client) with pre-declared configuration keys.

Install

$ npm i apollo-declare

Usage

const declare = require('apollo-declare')

const host = 'http://localhost:8070'
const appId = '100004458'
const namespace = 'default'

declare({
  host, appId, namespace,
  keys: {
    // Define `SENTRY_HOST` as
    // the value of the configuration key `sentry.host`
    REDIS_HOST: 'redis.host'
  }
})
// Emits when the value of a config key changes
.on('change', e => {
  // Do something with `e`
})
.ready()
.then(client => {
  // Get value by key
  client.get('REDIS_HOST')

  // For each KV pair
  client.each((value, key) => {
    console.log(value, key)
    // output: 192.168.10.1 REDIS_HOST
  })
})

Declare two keys in different namespaces

declare({
  host, appId, namespace,
  keys: {
    // Equivalent to:
    // REDIS_HOST: {
    //   key: 'redis.host'
    // }
    REDIS_HOST: 'redis.host',

    SENTRY_HOST: {
      key: 'sentry.host',
      // Which override namespace `default` with `common` for SENTRY_HOST
      namespace: 'common'
    }
  }
})

Use the first available value among a config set

If we have two namespaces, 'default' and 'common'.

In namespace 'default', there is no config key named 'dynamodb.region'. While in namespace 'common', the value of 'dynamodb.region' is 'ap-northeast-10'.

// Inside a async function
const client = apollo({
  host, appId,
  namespace: 'default',
  keys: {
    DYNAMO_DB_HOST: [
      // The config key `dynamodb.region` in namespace `default`
      // has higher priority than the one in namespace `common`
      {
        key: 'dynamodb.region'
        // namespace: inherit from the default namespace
      },
      // If `dynamodb.region` is not defined in namespace `default`,
      // then common.dynamodb.region will be used
      {
        key: 'dynamodb.region',
        namespace: 'common'
      }
    ]
  }
})

await client.ready()

console.log(client.get('DYNAMO_DB_HOST'))
// ap-northeast-10

declare(options): ApolloClient

  • options DeclareOptions
interface DeclareOptions extends ApolloOptions {
  // The default cluster name which defaults to `default`
  cluster?: string
  // The default namespace name which defaults to `application`
  namespace?: string
  // The key declarations
  keys: {
    [string]: string  // config key
      | KeyDeclaration
      // Priority list
      | Array<string | KeyDeclaration>
  }
}

interface KeyDeclaration {
  key: string
  cluster?: string
  namespace?: string
}

ApolloOptions is the options of ctrip-apollo

Returns ApolloClient the apollo client. ApolloClient is a subclass of EventEmitter

await client.ready(): this

Prepare and finish the initial fetching.

All methods except for client.on(type, handler) should be called after await client.ready()

client.get(key): string

Get the value of config key

client.each(callback): void

  • callback Function(value: string, key: string)

Executes the provided function callback once for each defined key.

Event: 'change'

  • key string config key
  • newValue string the new value of the key
  • oldValue string the old value of the key

Emits when the value of a config key changes

client.on('change', ({
  key,
  newValue,
  oldValue
}) => {
  console.log(`key "${key}" changes: "${oldValue}" -> "${newValue}"`)

  // Update process.env
  process.env[key] = newValue
})

License

MIT