Sha256: c4f692b947fde50f735150f5477aa42ccf7f0bcff0aa5edb03a1af2fecad5c90

Contents?: true

Size: 1.63 KB

Versions: 1

Compression:

Stored size: 1.63 KB

Contents

require 'ffi'
require 'dotenv'
require 'json'
require 'set'

module Envkey::Core
  extend FFI::Library

  def self.load_env spring_pre_fork_ts=nil,
                    overload_dotenv_vars=[],
                    overload_envkey_vars=[]
    original_env = ENV.to_h
    dotenv_vars = Dotenv.load
    updated_dotenv_vars = dotenv_vars.keys.select do |k|
      overload_dotenv_vars.include?(k) || original_env[k] == nil
    end
    overload_dotenv_vars.each do |k|
      ENV[k] = dotenv_vars[k]
    end

    if (key = ENV["ENVKEY"])
      reader, writer = IO.pipe

      fork do
        reader.close

        ffi_lib File.expand_path('../../ext/envkey.so', File.dirname(__FILE__))
        attach_function :EnvJson, [:pointer], :string

        json = EnvJson(FFI::MemoryPointer.from_string(key))
        writer.puts json
      end

      writer.close
      while json = reader.gets
        if json && json.gsub("\n","").gsub("\r", "") != ""
          envs = JSON.parse(json)
          updated_envkey_vars = []
          envs.each do |k,v|
            var = k.upcase
            if !ENV[var] || overload_envkey_vars.include?(var)
              updated_envkey_vars << var
              ENV[var] = v
            end
          end

          # avoid printing success message twice in quick succession when using spring
          if !spring_pre_fork_ts || (Time.now - spring_pre_fork_ts) > 3
            puts "ENVKEY: vars loaded and decrypted - access with ENV['YOUR_VAR_NAME']"
          end
          return [Set.new(updated_dotenv_vars), Set.new(updated_envkey_vars)]
        else
          raise "Envkey invalid. Couldn't load env."
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
envkey-0.1.2 lib/envkey/core.rb